A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jiaweizhang 中级黑马   /  2015-9-20 18:31  /  169 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题:如果线程中加了wait方法,那么线程就会停止运行,处于冻结状态,线程run方法的while循环一执行就停止,因而线程不会结束

解决:interrupt方法 中断线程,将处于冻结状态的线程,强制的恢复到运行状态(stop方法,不管什么情况,都将线程停止),
      这样就可以操作标识结束run方法

如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、
sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。

代码示例:

public class StopThreadThest {
        public static void main(String [] args){
                /**
                 * 练习题:停止线程
                 * stop方法已经过时
                 * 停止线程:结束run方法,就等于停止线程,而run方法通常执行循环代码,所以,只要停止循环,就可以停止线程
                 */
                StopThreadDemo st = new StopThreadDemo();
                Thread t1 = new Thread(st);
                Thread t2 = new Thread(st);
                t1.start();
                t2.start();
                int num = 0;
                while(true){
                        if(num++ == 60){               
                                t1.interrupt();                //将冻结线程强制恢复到运行状态
                                t2.interrupt();                //将冻结线程强制恢复到运行状态
                                break;
                        }
                        System.out.println(Thread.currentThread().getName() + "---"+num);
                }
                System.out.println("over");
        }
}

public class StopThreadDemo implements Runnable{
        private boolean flag = true;        //定义停止while循环标识
        @Override
        public synchronized void run() {
                while(flag){
                        try {
                                this.wait();        //这里加wait方法会导致线程处于冻结状态,就不会读取到标记
                        } catch (InterruptedException e) {
                                System.out.println(Thread.currentThread().getName()+"----Exception");
                        }
                        System.out.println(Thread.currentThread().getName()+"---run");
                        flag = false;        //线程恢复运行状态后,falg为true又会再进入冻结状态,这么将标识改为false以结束循环
                }
        }
       
}

开发中,当线程遇到冻结状态时,不能正常执行,这时要使用interrupt方法来解除冻结状态

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马