Java多线程系列--“基础篇”09之 interrupt()和线程终止方式(七)

2014-11-24 03:21:45 · 作者: · 浏览: 4
会抛出InterruptedException异常[该异常在while循环体内被捕获]。因此,t1理所当然的会进入死循环了。
解决该问题,需要我们在捕获异常时,额外的进行退出while循环的处理。例如,在MyThread的catch(InterruptedException)中添加break 或 return就能解决该问题。
下面是通过“额外添加标记”的方式终止“状态状态”的线程的示例:
复制代码
1 // Demo3.java的源码
2 class MyThread extends Thread {
3
4 private volatile boolean flag= true;
5 public void stopTask() {
6 flag = false;
7 }
8
9 public MyThread(String name) {
10 super(name);
11 }
12
13 @Override
14 public void run() {
15 synchronized(this) {
16 try {
17 int i=0;
18 while (flag) {
19 Thread.sleep(100); // 休眠100ms
20 i++;
21 System.out.println(Thread.currentThread().getName()+" ("+this.getState()+") loop " + i);
22 }
23 } catch (InterruptedException ie) {
24 System.out.println(Thread.currentThread().getName() +" ("+this.getState()+") catch InterruptedException.");
25 }
26 }
27 }
28 }
29
30 public class Demo3 {
31
32 public static void main(String[] args) {
33 try {
34 MyThread t1 = new MyThread("t1"); // 新建“线程t1”
35 System.out.println(t1.getName() +" ("+t1.getState()+") is new.");
36
37 t1.start(); // 启动“线程t1”
38 System.out.println(t1.getName() +" ("+t1.getState()+") is started.");
39
40 // 主线程休眠300ms,然后主线程给t1发“中断”指令。
41 Thread.sleep(300);
42 t1.stopTask();
43 System.out.println(t1.getName() +" ("+t1.getState()+") is interrupted.");
44
45 // 主线程休眠300ms,然后查看t1的状态。
46 Thread.sleep(300);
47 System.out.println(t1.getName() +" ("+t1.getState()+") is interrupted now.");
48 } catch (InterruptedException e) {
49 e.printStackTrace();
50 }
51 }
52 }
复制代码
运行结果:
复制代码
t1 (NEW) is new.
t1 (RUNNABLE) is started.
t1 (RUNNABLE) loop 1
t1 (RUNNABLE) loop 2
t1 (TIMED_WAITING) is interrupted.
t1 (RUNNABLE) loop 3
t1 (TERMINATED) is interrupted now.
复制代码
4. interrupted() 和 isInterrupted()的区别
最后谈谈 interrupted() 和 isInterrupted()。
interrupted() 和 isInterrupted()都能够用于检测对象的“中断标记”。
区别是,interrupted()除了返回中断标记之外,它还会清除中断标记(即将中断标记设为false);而isInterrupted()仅仅返回中断标记。