interrupt用来干嘛
终止被阻塞的任务。当抛出异常或该任务调用Thread.interrupted()时,中断状态将被复位。
阻塞状态
1)调用sleep()进入睡眠状态
2)调用wait()将线程挂起
3)任务在等待某个输入输出的完成
4)任务试图在某个对象上调用其同步控制方法。但是对象锁不可用。因为另外一个任务已经获得这个锁
3)、4)两种情形将不会被中断
简单Demo
public class Interrupted {
public static void main(String[] args) throws InterruptedException {
Thread sleepThread = new Thread(new SleepRunner(), "SleepThread");
sleepThread.setDaemon(true);
Thread busyThread = new Thread(new BusyRunner(), "BusyThread");
busyThread.setDaemon(true);
sleepThread.start();
busyThread.start();
TimeUnit.SECONDS.sleep(5);
sleepThread.interrupt();
busyThread.interrupt();
System.out.println("SleepThread interrupted is " + sleepThread.isInterrupted());
System.out.println("BusyThread interrupted is " + busyThread.isInterrupted());
//防止另外两个线程立即退出
SleepUtils.second(2);
}
static class SleepRunner implements Runnable {
@Override
public void run() {
while (true) {
SleepUtils.second(10);
}
}
}
static class BusyRunner implements Runnable {
@Override
public void run() {
while (true) {}
}
}
} 那个没有被阻塞的线程不能被打断,并且在抛出异常时重置中断标识位 Thread.interrupt()提供了离开了run()循环而不抛出异常的方法