package myswing;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class LuckyDraw implements ActionListener {
String[] str = null;
JLabel jl = null;
boolean isEnd = true;
ExecutorService ex = Executors.newFixedThreadPool(2);
public static void main(String[] args) {
new LuckyDraw();
}
public LuckyDraw() {
str = new String[]{"1:胡锦涛","2:吴邦国","3:温家宝","4:贾庆林","5:贾庆林","6:习近平","7:李克强"
,"8:贺国强","9:周永康","10:王 刚","11:王乐泉","12:王兆国","13:王岐山","14:回良玉","15:刘 淇","16:刘云山"
,"17:李源潮","18: 汪 洋","19:张德江","20:俞正声","21:徐才厚","22:郭伯雄","23:薄熙来","24:令计划","25:王沪宁",
"26:孟建柱","27:王胜俊","28:王胜俊"};
JFrame jf = new JFrame();
jl = new JLabel("究竟谁是下一届主席呢?");
JButton jb = new JButton("开始");
JButton jb1 = new JButton("结束");
JPanel jp = new JPanel();
jp.setLayout(new GridLayout(1,2));
jf.add(jl);
jp.add(jb);
jp.add(jb1);
jf.add(jp,BorderLayout.SOUTH);
jb.addActionListener(this);
jb1.addActionListener(this);
jf.setTitle("幸运抽奖");
jf.setLocation(400,400);
jf.setSize(200,200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command.equals("开始")){
if(isEnd) {
isEnd = false;
Thread t = new Thread(new MyRun());
try {
Thread.sleep(200);
t.start();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
ex.shutdown();
}else {
Thread t = new Thread(new MyRun1());
t.start();
}
}
class MyRun implements Runnable {
Lock lock = new ReentrantLock();
public void run() {
while(!isEnd){
try {
lock.lock();
Thread.sleep(20);
String name = str[new Random().nextInt(str.length)];
jl.setText(name);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
lock.unlock();
}
}
}
class MyRun1 implements Runnable {
public void run() {
isEnd = true;
}
}
}这是可以正常运行的程序
package myswing;import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class CopyOfLuckyDraw implements ActionListener {
String[] str = null;
JLabel jl = null;
boolean isEnd = true;
ExecutorService ex = Executors.newFixedThreadPool(2); public static void main(String[] args) {
new CopyOfLuckyDraw();
} public CopyOfLuckyDraw() { str = new String[] { "1:胡锦涛", "2:吴邦国", "3:温家宝", "4:贾庆林", "5:贾庆林",
"6:习近平", "7:李克强", "8:贺国强", "9:周永康", "10:王 刚", "11:王乐泉",
"12:王兆国", "13:王岐山", "14:回良玉", "15:刘 淇", "16:刘云山", "17:李源潮",
"18: 汪 洋", "19:张德江", "20:俞正声", "21:徐才厚", "22:郭伯雄", "23:薄熙来",
"24:令计划", "25:王沪宁", "26:孟建柱", "27:王胜俊", "28:王胜俊" };
JFrame jf = new JFrame();
jl = new JLabel("究竟谁是下一届主席呢?");
JButton jb = new JButton("开始");
JButton jb1 = new JButton("结束");
JPanel jp = new JPanel();
jp.setLayout(new GridLayout(1, 2));
jf.add(jl);
jp.add(jb);
jp.add(jb1);
jf.add(jp, BorderLayout.SOUTH);
jb.addActionListener(this);
jb1.addActionListener(this);
jf.setTitle("幸运抽奖");
jf.setLocation(400, 400);
jf.setSize(200, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (command.equals("开始")) {
if (isEnd) {
isEnd = false;
while (!isEnd)
try {
Thread.sleep(20);
String name = str[new Random().nextInt(str.length)];
jl.setText(name);
if (isEnd == true)
break;
} catch (Exception e1) {
e1.printStackTrace();
}
}
ex.shutdown();
} else {
Thread t = new Thread(new MyRun1());
t.start();
} } class MyRun1 implements Runnable {
public void run() {
isEnd = true;
} }
}
这是不可以运行的程序,我在想,为什么不可以把设置label值的代码放到主线程里面运行,而要另外开一个线程来运行。有人的解释是说你不可能让主线程停止运行啊。我在想,我并非让他停止运行,我只是让他跳出这个设置label值的代码啊,我不知道大家能有耐心看完这个程序不?
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class LuckyDraw implements ActionListener {
String[] str = null;
JLabel jl = null;
boolean isEnd = true;
ExecutorService ex = Executors.newFixedThreadPool(2);
public static void main(String[] args) {
new LuckyDraw();
}
public LuckyDraw() {
str = new String[]{"1:胡锦涛","2:吴邦国","3:温家宝","4:贾庆林","5:贾庆林","6:习近平","7:李克强"
,"8:贺国强","9:周永康","10:王 刚","11:王乐泉","12:王兆国","13:王岐山","14:回良玉","15:刘 淇","16:刘云山"
,"17:李源潮","18: 汪 洋","19:张德江","20:俞正声","21:徐才厚","22:郭伯雄","23:薄熙来","24:令计划","25:王沪宁",
"26:孟建柱","27:王胜俊","28:王胜俊"};
JFrame jf = new JFrame();
jl = new JLabel("究竟谁是下一届主席呢?");
JButton jb = new JButton("开始");
JButton jb1 = new JButton("结束");
JPanel jp = new JPanel();
jp.setLayout(new GridLayout(1,2));
jf.add(jl);
jp.add(jb);
jp.add(jb1);
jf.add(jp,BorderLayout.SOUTH);
jb.addActionListener(this);
jb1.addActionListener(this);
jf.setTitle("幸运抽奖");
jf.setLocation(400,400);
jf.setSize(200,200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command.equals("开始")){
if(isEnd) {
isEnd = false;
Thread t = new Thread(new MyRun());
try {
Thread.sleep(200);
t.start();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
ex.shutdown();
}else {
Thread t = new Thread(new MyRun1());
t.start();
}
}
class MyRun implements Runnable {
Lock lock = new ReentrantLock();
public void run() {
while(!isEnd){
try {
lock.lock();
Thread.sleep(20);
String name = str[new Random().nextInt(str.length)];
jl.setText(name);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
lock.unlock();
}
}
}
class MyRun1 implements Runnable {
public void run() {
isEnd = true;
}
}
}这是可以正常运行的程序
package myswing;import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class CopyOfLuckyDraw implements ActionListener {
String[] str = null;
JLabel jl = null;
boolean isEnd = true;
ExecutorService ex = Executors.newFixedThreadPool(2); public static void main(String[] args) {
new CopyOfLuckyDraw();
} public CopyOfLuckyDraw() { str = new String[] { "1:胡锦涛", "2:吴邦国", "3:温家宝", "4:贾庆林", "5:贾庆林",
"6:习近平", "7:李克强", "8:贺国强", "9:周永康", "10:王 刚", "11:王乐泉",
"12:王兆国", "13:王岐山", "14:回良玉", "15:刘 淇", "16:刘云山", "17:李源潮",
"18: 汪 洋", "19:张德江", "20:俞正声", "21:徐才厚", "22:郭伯雄", "23:薄熙来",
"24:令计划", "25:王沪宁", "26:孟建柱", "27:王胜俊", "28:王胜俊" };
JFrame jf = new JFrame();
jl = new JLabel("究竟谁是下一届主席呢?");
JButton jb = new JButton("开始");
JButton jb1 = new JButton("结束");
JPanel jp = new JPanel();
jp.setLayout(new GridLayout(1, 2));
jf.add(jl);
jp.add(jb);
jp.add(jb1);
jf.add(jp, BorderLayout.SOUTH);
jb.addActionListener(this);
jb1.addActionListener(this);
jf.setTitle("幸运抽奖");
jf.setLocation(400, 400);
jf.setSize(200, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (command.equals("开始")) {
if (isEnd) {
isEnd = false;
while (!isEnd)
try {
Thread.sleep(20);
String name = str[new Random().nextInt(str.length)];
jl.setText(name);
if (isEnd == true)
break;
} catch (Exception e1) {
e1.printStackTrace();
}
}
ex.shutdown();
} else {
Thread t = new Thread(new MyRun1());
t.start();
} } class MyRun1 implements Runnable {
public void run() {
isEnd = true;
} }
}
这是不可以运行的程序,我在想,为什么不可以把设置label值的代码放到主线程里面运行,而要另外开一个线程来运行。有人的解释是说你不可能让主线程停止运行啊。我在想,我并非让他停止运行,我只是让他跳出这个设置label值的代码啊,我不知道大家能有耐心看完这个程序不?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货