java中断知识:
中断和nio也有很大联系,如java.nio.channels.Selector、java.nio.channels.InterruptibleChannel;
如果线程被InterruptibleChannel这个IO操作阻塞,那么Channel会被关闭,中断状态会被设置;
如果线程被Selector这个IO操作阻塞,中断状态也会被设置,并且立即从该操作返回,就像Selector的wakeup方法被调用一样;

Thread总是可以中断自己;即在线程内部调用this.interrupt();
一个线程可以中断另一个线程?可以,如main线程中执行另一个线程的thread.interrupt();
Thread的中断状态会被wait、join、sleep清除;(不重要)
反过来,中断可以直接让wait、sleep、join中的线程抛出InterruptedException异常,清空中断标志位,并退出阻塞状态;但不是终止线程!(重要)

interrupt可以代替stop,因为后者不安全;
(更准确说,interrupt+用户对中断标记位的判断+手动退出,来代替粗鲁的stop;)

interrupt对NEW、TERMINATED状态的线程无意义;
RUNNABLE状态的线程在遭遇中断操作时,只会设置该线程的中断标志位,并不会让线程实际中断;
(用户程序可通过if判断中断标志位是否被设置来中断自己的程序而不是系统强制的中断;)
BLOCKED状态的线程在遭遇中断操作时,不会对该线程产生任何影响,依然只是设置中断标志位;(对应synchronized)
(但Lock类的lockInterruptibly方法是可以中断的!)
WAITING/TIMED_WAITING状态下的线程对于中断操作是敏感的,它们会抛出异常并清空中断标志位(即重新设置为false);
(注意,线程不会停止,只是从WAITING/TIMED_WAITING状态唤醒。。)

java中断和操作系统的中断完全不同,后者指停止去做别的事,完了后又返回原程序继续运行;前者就是指停止程序;

JUC中有些是可以中断的(利用中断从阻塞状态唤醒),如CountDownLatch的await、CyclicBarrier的await、FutureTask的get、StampedLock的readLockInterruptibly、ReentrantReadWriteLock的lockInterruptibly、ReentrantLock的lockInterruptibly、以及AbstractQueuedSynchronizer的acquireInterruptibly等;
(当然,它们也会清除中断状态,以及抛出InterruptedException)
也有一些会忽略中断,如ForkJoinTask的internalWait;
(重点了解ReentrantLock和AQS即可!!!)
(在io的socket、nio也有大量中断的例子,可以说中断非常常见,毕竟只要有线程,就会涉及中断;事实上Object的wait就抛出了InterruptedException)