线程中断机制
public static native void sleep(long millis) throws InterruptedException
if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown(调用sleep后抛出异常时,会清除线程的状态)
public void interrupt()
: 中断线程public static boolean interrupted()
: 判断线程是否被中断,并清除线程状态public boolean isInterrupted()
: 判断线程是否被中断,但不清除线程状态
public static void interruptMechanism() throws InterruptedException {
Thread t1 = new Thread(){
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()){
System.out.println(Thread.currentThread().getName() + " is running");
try {
System.out.println(Thread.currentThread().getName() + " is sleeping");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " end sleep");
} catch (InterruptedException e) {
//再次设置中断标志位,在Thread.sleep中被中断后,sleep会清除标志位
//此时Thread.currentThread().isInterrupted()还是等于true
Thread.currentThread().interrupt();
//after执行Thread.currentThread().interrupt();
//此时Thread.currentThread().isInterrupted()等于false
}
}
if (Thread.currentThread().isInterrupted()){
System.out.println(Thread.currentThread().getName() + " is stop");
}
}
};
t1.start();
Thread.sleep(2000);
t1.interrupt();
}
public static void main(String[] args) {
try {
interruptMechanism();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
结果:
Thread-0 is running
Thread-0 is sleeping
Thread-0 end sleep
Thread-0 is running
Thread-0 is sleeping
Thread-0 end sleep
Thread-0 is stop