如题

解决方案 »

  1.   


     boolean isAlive() 
              测试线程是否处于活动状态。 
      

  2.   

    应该不时,线程是又start方法开始的,所以也应该是start方法结束才能算线程结束了,
    run方法只是在start方法中被调用,给我们为线程提供其所需作的操作。在run方法结束后,线程结束前应该还有一些操作需要执行,如内存释放之类的。
    纯属个人理解
      

  3.   

    比如在Windows里,线程函数之后要通知每个已经加载的DLL线程即将结束,
      

  4.   

    应该不算结束,run就好比你吃饭这个行为,你吃完饭了,不能说拍拍屁股走人了,总得收拾一下吧,不然你妈要教训你的
      

  5.   

    其实你可以理解为run方法执行完了。这个线程也就结束了。
    不过也可以通过
    getState() 查看该线程的状态。 
    isInterrupted()  查看线程是否已经中断。 
      

  6.   

    退出run方法。
    1.异常。
    2.正常执行完成。
    要做的事情都完了,就相当于结束了。
      

  7.   

    所以也应该是start方法结束才能算线程结束了
    真的吗???????
      

  8.   

    不是,run方法结束之后还要执行相关的内存释放操作。
      

  9.   

    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值的代码啊,所以提了上面的问题
      

  10.   

    应该不是 main方法是主线程 要等把代码全都执行完了才结束 意思也就是 线程与程序是同时开始同时结束的 所以线程的结束应该与run方法没有什么关系吧 
      

  11.   

    我觉得这个,很多种说法,线程结束,怎样才算结束呢?boolean isAlive()判断false大致就可以认为线程结束了。
      

  12.   

    这个肯定不对了,start方法只是通知一下要开始执行,马上返回的。
      

  13.   

    java里 线程是个很不听话的东东~~~~你让他开始·~~他不一定是立刻开始(由其是多线程的时候,开一堆线程)
    你让他结束的时候·~~他有时候会莫名其妙的死等,有时候会延时结束~~~它的结束时间是系统决定的·~~
      

  14.   

    isInterrupted() 查看线程是否已经中断