InterruptedException的解读

InterruptedException的解读
最近写了些多线程的程序,用Thread.sleep()的时候有时会碰到InterruptedException。查了一些资料,下面是我自己的一些理解。

阻塞方法
一些多线程相关的方法是阻塞方法,比如Thread.sleep(), Thread.wait(), Thread.join()。

这些方法的执行通常需要比较长的时间来完成,当代码执行到阻塞方法时,一般要等待该方法返回后

才能继续往下执行,而InterruptedException提供了一种特殊的机制提前结束阻塞方法。

中断变量
每个线程都会维护一个bool变量,表示线程处于中断(true)或者非中断状态(false)。在线程初始的情况下中断变量为false。

这个变量的bool值可以通过Thread.isInterrupted()方法来读取,通过Thread.interrupted()方法来清除中断(即将中断变量置为false)。

线程中断
一个线程可以通过调用Thread.interrupt()方法来中断另外一个线程,具体过程如下:

1. 中断变量被设置为true。

2. 如果线程执行到了阻塞方法,那么该方法取消阻塞,并将中断变量重新置为false。
(这种机制是通过阻塞方法内部不断轮询中断变量的值来实现的)

例子:
 1  class  ThreadTest  implements  Runnable {
 2 
 3      @Override
 4       public   void  run() {
 5                  System.out.println( " before sleep " );
 6               try  {
 7                  Thread.sleep( 5000 );
 8              }  catch  (InterruptedException e) {
 9                                  System.out.println(Thread.currentThread().getName());
10                  Thread.currentThread().interrupt();
11                  System.out.println( " after interrupt " );
12              }        
13          System.out.println( " after sleep " );    
14          
15           try  {
16              Thread.sleep( 5000 );
17          }  catch  (InterruptedException e) {
18               //  TODO Auto-generated catch block
19               // e.printStackTrace();
20              System.out.println(Thread.currentThread().getName());
21              Thread.currentThread().interrupt();
22              System.out.println( " after interrupt " );
23          }
24          System.out.println( " after sleep " );    
25      }
26      
27  }
28 
29  public   class  ThreadBasic {
30      
31       public   static   void  main(String[] args) {
32          
33          Thread t  =   new  Thread( new  ThreadTest(),  " thread-1 " );
34          t.start();
35          
36          t.interrupt();
37          System.out.println(t.isInterrupted());
38      }
39  }






你可能感兴趣的:(InterruptedException的解读)