Java 的中断机制,只是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断后的操作(退出或者回滚)

thread.interrupt() :将线程的中断标识为设置为 true

  1. public void interrupt() {
  2. if (this != Thread.currentThread())
  3. checkAccess();
  4. synchronized (blockerLock) {
  5. Interruptible b = blocker;
  6. if (b != null) {
  7. interrupt0(); // Just to set the interrupt flag
  8. b.interrupt(this);
  9. return;
  10. }
  11. }
  12. interrupt0();
  13. }

Thread.interrupted() :判断中断标识位是否为 true,如果为 true,会重置中断标识位为 false(所以需要手动处理中断后的操作)

  1. public static boolean interrupted() {
  2. return currentThread().isInterrupted(true);
  3. }

Thread.currentThread().isInterrupted() :判断中断标识位是否为 true不会重置中断标识位

  1. public boolean isInterrupted() {
  2. return isInterrupted(false);
  3. }

正确的使用方式
  1. Thread t1 = new Thread(new Runnable() {
  2. @Override
  3. public synchronized void run() {
  4. while (true) {
  5. i++;
  6. System.out.println(i);
  7. if (Thread.interrupted()) {
  8. System.out.println("interrupted");
  9. break;
  10. }
  11. }
  12. }
  13. });

sleep()wait()可以感知到中断信号,并且会抛出一个异常,同时会重置中断标识位,所以如果有需要的话,需要在 catch 中重设中断标识位

LockSupport.park() 也可以感知到中断信号不会抛出异常,也不会重置中断标识位