Thread interrupt表示什么
学习了:https://www.zhihu.com/question/41048032?sort=created
学习了:http://blog.csdn.net/canot/article/details/51087772 这个膜拜一下;
源码膜拜:
public class Thread3 extends Thread{ public void run(){ while(true){ if(Thread.currentThread().isInterrupted()){ System.out.println("Someone interrupted me."); } else{ System.out.println("Thread is Going..."); } } } public static void main(String[] args) throws InterruptedException { Thread3 t = new Thread3(); t.start(); Thread.sleep(3000); t.interrupt(); } }
Interrupt经典使用:
//Interrupted的经典使用代码 public void run(){ try{ .... while(!Thread.currentThread().isInterrupted()&& more work to do){ // do more work; } }catch(InterruptedException e){ // thread was interrupted during sleep or wait } finally{ // cleanup, if required } }
三种状态会抛出异常;
但是当线程被阻塞的时候,比如被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞时。调用它的interrput()方法。可想而知,没有占用CPU运行的线程是不可能给自己的中断状态置位的。这就会产生一个InterruptedException异常。
不是所有的都可以中断:
不是所有的阻塞方法收到中断后都可以取消阻塞状态, 输入和输出流类会阻塞等待 I/O 完成,但是它们不抛出 InterruptedException,而且在被中断的情况下也不会退出阻塞状态. 尝试获取一个内部锁的操作(进入一个 synchronized 块)是不能被中断的,但是 ReentrantLock 支持可中断的获取模式即 tryLock(long time, TimeUnit unit)。