interrupt、interrupted和isInterrupted的区别

发布时间:2019-10-04  栏目:编程  评论:0 Comments

1.interrupt()

1、interrupt() 

  interrupt

interrupt方法用于中断线程。调用该方法的线程的状态为将被置为”中断”状态。

interrupt方法用于中断线程。调用该方法的线程的状态为将被置为”中断”状态。

  下面是interrupt方法的文档的一部分:

注意线程中断仅仅是改变线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态位并做出相应处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。

注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。

图片 1图片 2

2、interrupted() 和 isInterrupted()首先看一下API中该方法的实现:

 

1 * <p> If this thread is blocked in an invocation of the {@link
2      * Object#wait() wait()}, {@link Object#wait(long) wait(long)}, or {@link
3      * Object#wait(long, int) wait(long, int)} methods of the {@link Object}
4      * class, or of the {@link #join()}, {@link #join(long)}, {@link
5      * #join(long, int)}, {@link #sleep(long)}, or {@link #sleep(long, int)},
6      * methods of this class, then its interrupt status will be cleared and it
7      * will receive an {@link InterruptedException}.
public static boolean interrupted() { return currentThread().isInterrupted; }

2、interrupted() 和 isInterrupted()

View Doc

该方法就是直接调用当前线程的isInterrupted的方法。然后再来看一下API中isInterrupted的实现:

首先看一下API中该方法的实现:

  如果线程由于调用Object类的wait()方法、Thread类的join()实例方法以及Thread.sleep()静态方法而被挂起,此时其他线程调用了这个线程的interrupt方法,那么这个线程的中断状态会被清除,并会抛出一个InterruptedException异常。 

public boolean isInterrupted() { return isInterrupted; }
1 public static boolean interrupted () {

  从上面加粗的文字中可以得出两点结论:

该方法却直接调用当前线程的isInterrupted的方法。

2      return currentThread().isInterrupted(true);

  1 即便调用了interrupt方法,之后用isInterrupted()方法检查它的中断状态时也不一定能得到true。

因此这两个方法有两个主要区别:

3 }

  2 如果线程当前运行处的代码块不对InterruptedException异常进行合适的处理,那么interrupt方法就没有任何效果。

1.interrupted 是作用于当前线程,isInterrupted
是作用于调用该方法的线程对象所对应的线程。
(线程对象对应的线程不一定是当前运行的线程。例如我们可以在A线程中去调用B线程对象的isInterrupted方法。)2.这两个方法最终都会调用同一个方法—–isInterrupted(
Boolean 参数),,只不过参数固定为一个是true,一个是false; 注意:
isInterrupted( Boolean 参数)是isInterrupted的重载方法。

该方法就是直接调用当前线程的isInterrupted(true)的方法。

  举一个例子来验证上面的结论:

由于第二个区别主要体现在调用的方法的参数上,让我们来看一看这个参数是什么含义

然后再来看一下API中
isInterrupted的实现:

图片 1图片 4

先来看一看被调用的方法 isInterrupted(boolean
arg)(Thread类中重载的方法)的定义:private native boolean isInterrupted( boolean ClearInterrupted);原来这是一个本地方法,看不到源码。不过没关系,通过参数名ClearInterrupted我们就能知道,这个参数代表是否要清除状态位。如果这个参数为true,说明返回线程的状态位后,要清掉原来的状态位。这个参数为false,就是直接返回线程的状态位。

1 public boolean isInterrupted () {
 1 public abstract class StoppableThread extends Thread {
 2 
 3     @Override
 4     public void run() {
 5         while(!isInterrupted()){
 6             System.out.println("isInterrupted: " + isInterrupted());
 7             doWork();
 8         }
 9         System.out.println("END");
10     }
11 
12     protected abstract void doWork();
13 
14     public static void main(String[] args) {
15         StoppableThread thread = new StoppableThread() {
16 
17             @Override
18             protected void doWork() {
19                 System.out.println("running...");
20                 try {
21                     sleep(500);
22                 } catch (InterruptedException e) {
23                     e.printStackTrace();
24                 }
25             }
26         };
27         thread.start();
28 
29         try {
30             Thread.sleep(2200);
31         } catch (InterruptedException e) {
32             e.printStackTrace();
33         }
34 
35         System.out.println("即将调用interrupt()方法");
36         thread.interrupt();
37     }
38 }

这两个方法很好区分,只有当前线程才能清除自己的中断位(对应interrupted

2      return isInterrupted( false);

View Code

写一个例子来验证一下

3 }

  输出结果:

public class Interrupt { public static void main(String[] args) throws Exception { Thread t = new Thread(new Worker; t.start(); Thread.sleep; t.interrupt(); System.out.println("Main thread stopped."); } public static class Worker implements Runnable { public void run() { System.out.println("Worker started."); try { Thread.sleep; } catch (InterruptedException e) { System.out.println("Worker IsInterrupted: " + Thread.currentThread().isInterrupted; } System.out.println("Worker stopped."); } } } 

该方法却直接调用当前线程的isInterrupted(false)的方法。

图片 1图片 6

输出结果

因此这两个方法有两个主要区别:

 1 isInterrupted: false
 2 running...
 3 isInterrupted: false
 4 running...
 5 isInterrupted: false
 6 running...
 7 isInterrupted: false
 8 running...
 9 isInterrupted: false
10 running...
11 即将调用interrupt()方法
12 isInterrupted: false
13 running...
14 java.lang.InterruptedException: sleep interrupted
15     at java.lang.Thread.sleep(Native Method)
16     at readerandwriter.StoppableThread$1.doWork(StoppableThread.java:22)
17     at readerandwriter.StoppableThread.run(StoppableThread.java:9)
18 isInterrupted: false
19 running...
20 isInterrupted: false
21 running...
Worker started. Main thread stopped. Worker IsInterrupted: false Worker stopped. 
  1. interrupted 是作用于当前线程,isInterrupted
    是作用于调用该方法的线程对象所对应的线程。(线程对象对应的线程不一定是当前运行的线程。例如我们可以在A线程中去调用B线程对象的isInterrupted方法。)
  2. 这两个方法最终都会调用同一个方法—–isInterrupted( Boolean 参数````),,只不过参数固定为一个是true,一个是false;
                  注意: isInterrupted( Boolean 参数````)是isInterrupted( ``)的重载方法。

View Code

结论:

 

  

1.Thread.currentThread().interrupt();
这个用于清除中断状态,这样下次调用Thread.interrupted()方法时就会一直返回为true,因为中断标志已经被恢复了。而调用isInterrupted()只是简单的查询中断状态,不会对状态进行修改。2.interrupt()是用来设置中断状态的。返回true说明中断状态被设置了而不是被清除了。我们调用sleepwait等此类可中断(throw InterruptedException)方法时,一旦方法抛出InterruptedException,当前调用该方法的线程的中断状态就会被jvm自动清除了,就是说我们调用该线程的isInterrupted
方法时是返回false。如果你想保持中断状态,可以再次调用interrupt方法设置中断状态。这样做的原因是,java的中断并不是真正的中断线程,而只设置标志位来通知用户。如果你捕获到中断异常,说明当前线程已经被中断,不需要继续保持中断位。3.interrupted是静态方法,返回的是当前线程的中断状态。例如,如果当前线程被中断(没有抛出中断异常,否则中断状态就会被清除),你调用interrupted方法,第一次会返回true。然后,当前线程的中断状态被方法内部清除了。第二次调用时就会返回false。如果你刚开始一直调用isInterrupted,则会一直返回true,除非中间线程的中断状态被其他操作清除了。

由于第二个区别主要体现在调用的方法的参数上,让我们来看一看这个参数是什么含义

  InterruptedException

留下评论

网站地图xml地图