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值的代码啊,我不知道大家能有耐心看完这个程序不?