stop()方法
- 立刻释放所有monitors
- 可能会导致一系列难以处理的问题
- 新版本stop方法不可用,会直接抛异常
- 举个例子:程序运行中直接关机
interrupt()方法
-
interrupt()其本身并不是一个强制打断线程的方法,其仅仅会修改线程的interrupt标志位,然后让线程自行去读标志位,自行判断是否需要中断。
image.png
-
一般的,我们会在执行耗时操作前去做isInterrupted()的判断,比如说IO、网络之类的,避免多余的操作。
-
也顺便说明的下对象里的wait()和线程里的sleep()方法,为什么总是和InterruptedException扯到一起?在设计里,如果线程处于休眠状态,那一旦其被调用interrupt()方法,则就没有必要继续休眠下去了,直接抛出异常InterruptedException,让被打断线程去做收尾操作,及时释放线程资源。
image.png
-
interrupt()是一个“很软”的操作,也就是提醒线程应该结束了,至于如何结束,什么时候结束,以及是否需要结束,都是由线程自行处理。所以,interrupt()的使用,会让开发做更多的事,但这是有必要的,因为只有线程自己,才知道如何合适的结束自己。
-
还有一个Thread的类方法intermpted() ,这个和线程对象的isInterrupted方法区别就是,isInterrupted不会清除中断标记。
退出标志
- 开启多线程时,运行代码通常是循环结构,只要控制住循环,就可以让run方法结束,也就是线程结束。
public class StopThread implements Runnable{
private volatile boolean flag = true;
@Override
public void run() {
while (flag) {
System.out.println(Thread.currentThread().getName() + "...run");
}
System.out.println("...stop");
}
public void set() {
flag = false;
}
}
网友评论