黑马程序员技术交流社区

标题: 中断线程的问题 [打印本页]

作者: ↙五线谱╲    时间: 2013-12-4 13:55
标题: 中断线程的问题
package manyThreadRun;

/*
* Stop方法已经过时。
*
* 如何停止线程?
* 只有一种,run方法结束。
* 开启多线程运行,运行代码通常是循环结构
*
* 只要控制住循环,就可以让run方法结束,也就是线程结束。
*
* 特殊情况:
* 当线程处于冻结状态,
* 就不会读取到标记,那么线程就不会结束。
*
* 当没有指定的方式让冻结的线程恢复到运行状态时,这是需要对冻结进行清除。
* 强制让线程恢复到运行状态中来。这样就就可以操作标记让线程结束。
*
* Thread类提供该方法 interrupt();
*/

class StopThread implements Runnable {
        private boolean flag = true;

        public synchronized void run() {
                while (flag) {
                        try {
                                wait();
                        } catch (InterruptedException e) {
                                System.out.println(Thread.currentThread().getName()
                                                + "....Exception");
                                flag = false;
                        }
                        System.out.println(Thread.currentThread().getName() + "....run");
                }
        }

        public void changeFlag() {
                flag = false;
        }
}

public class StopThreadDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                StopThread st = new StopThread();
                Thread t1 = new Thread(st);
                Thread t2 = new Thread(st);

                t1.start();
                t2.start();

                int num = 0;
                while (true) {
                        if (num++ == 60) {
                                // st.changeFlag();
                                t1.interrupt();
                                t2.interrupt();
                                break;
                        }
                        System.out.println(Thread.currentThread().getName() + "...." + num);
                }
                System.out.println("over");
        }
}
结果有三种:
1:over
Thread-0....Exception
Thread-0....run
Thread-1....Exception
Thread-1....run
2:over
Thread-0....Exception
Thread-0....run
3:over
Thread-1....Exception
Thread-1....run

为什么结果是三种情况呢?有点糊涂
作者: .Mr    时间: 2013-12-4 14:59
线程应该运行全部结束了。
主函数一运行,2个线程都会处于冻结状态 因为wait
当到interrtupt时全强制恢复到运行状态,执行下面程序,改变了标记线程停止
我运行了一下 结果如下
class StopThread implements Runnable
{
        private boolean flag = true;
        public synchronized void run()
        {
                while(flag)
                {
                        try
                        {
                                wait();//t0 t1
                        }
                        catch (InterruptedException e)
                        {
                                System.out.println(Thread.currentThread().getName()+"....."+"exception");
                                flag = false;
                        }
                       
                        System.out.println(Thread.currentThread().getName()+"......run");
                }
        }
        public void setFlag()
        {
                flag = false;
        }
}



class StopThreadDemo
{
        public static void main(String[] args)
        {
                StopThread st = new StopThread();

                Thread t1 = new Thread(st);
                Thread t2 = new Thread(st);

                t1.start();
                t2.start();


                int num = 0;
                while(true)
                {
                        if(++num==50)
                        {
//                                st.setFlag();
                                t1.interrupt();
                                t2.interrupt();
                                break;
                        }
                        System.out.println("main...."+num);
                }

                System.out.println("over");
        }
}
H:\QQ图片20131204145635.jpg
作者: .Mr    时间: 2013-12-4 15:01
.Mr 发表于 2013-12-4 14:59
线程应该运行全部结束了。
主函数一运行,2个线程都会处于冻结状态 因为wait
当到interrtupt时全强制恢复到 ...

H:\QQ图片20131204145635.jpg
作者: 王家胜    时间: 2013-12-4 18:23
本帖最后由 王家胜 于 2013-12-4 18:24 编辑

我amd的cpu只能执行出两个线程都存在的结果,试了好多次了。
api上说
如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。
t1,t2两个线程都在那里等待
t1.interrupt();第一个线程抛出异常,第一个线程就干掉了


作者: 简★零度    时间: 2013-12-5 22:57
下次问题解决了就把类型改成提问结束!谢谢!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2