由上面我们可以看到,通过标志位的方法我们可以很自然和温柔随和的把一个线程终止掉.java中没有一种安全的抢占式方法来停止线程,因为也就没有安全的抢占式方法来停止线程.但是他有一种协作式的机制,是请求取消的任务和代码都遵循一种协商好的协议.,设置”已经请求取消”标志,而任务将定时的查看该标志.
但是我们通过上面的示例发现,使用上面的方法线程一直在运行,处于active(“活”)的状态,如果调用sleep或者wait()方法,线程将会处于睡眠或者阻塞状态那么这种方法将会不起作用——-任务可能永远不会检查取消标志,因此永远无法结束
public class InterruptedThreadDemo { public static void main(String[] args) { // 子线程开启 ThreadTerminal tt = new ThreadTerminal(); tt.start(); try { // 主线程休息3s,然后打断子线程 Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // 打断子线程 tt.interrupt(); }}class ThreadTerminal extends Thread { private int counter = 0; public void run() { synchronized (this) { while (true) { System.out.println("time = " + System.currentTimeMillis()); counter++; try { if (counter == 5) { // 使线程处于阻塞状态 wait(); } } catch (InterruptedException e) { // 捕获InterruptedException,然后退出程序 System.out.println("捕获到InterruptedException , 线程结束"); return; } } } }}
通过上面方法当线程阻塞状态的时候也可以被终止掉. 例如.访问网络服务器的时候, 网络请求在异步队列中, 要取消阻塞的任务
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |