在java中一个线程开始执行后,如果想停止它,在早起的时候我们可以使用stop方法。但是这个方法太暴力了,如果线程在处理一些很重要的工作时,可能只执行到一半,就被停止了。然程序执行结果很难控。
后来引入了interrupt方法。
当调用interrupt()方法后并不是把执行中的线程马上中断,而是给线程一个标记。
我们自己new出来的线程中可以自己加逻辑判断,是否是有其他线程想中断自己,如果是可以做出自己的选择是否中断,以及如何中断。
interrupt相关的方法有三个:
interrupt() -- 向某个线程发出中断信号,并将该线程标记为中断状态
isInterrupted() -- 返回该线程的中断状态
interrupted() -- 静态方法,返回当前线程的中断状态,并清除中断信号
但是在一个线程被标记为中断后,执行到下面方法是会自动抛出异常:
1. sleep()方法
2. wait()方法
3.join()方法
例子 1, sleep 方法可以被中断:
@Test
public void testInterruptSleep(){
Thread t1 = new Thread(()->{
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
logger.info("t1 have been interrupted when he is sleeping!");
}
logger.info("t1");
});
t1.start();
t1.interrupt();
}
执行结果:
例子 2, wait方法可以被中断。
@Test
public void testInterruptWait(){
Thread t1 = new Thread(()->{
try {
synchronized(this){
wait();
}
} catch (InterruptedException e) {
logger.info("t1 have been interrupted when he is waiting!");
}
logger.info("t1");
});
t1.start();
t1.interrupt();
}
执行结果:
例子3, join方法可以被中断,注意,在哪个线程中调用join方法阻塞按个线程,所以中断的应该是被阻塞的那个线程。如下面的例子阻塞的是t2,所以中断的也是t2.
@Test
public void testInterruptJoin(){
Thread t1 = new Thread(()->{
for (;;){
Thread.yield();
}
});
Thread t2 = new Thread(()->{
try {
t1.join();
} catch (InterruptedException e) {
logger.info("t2 have been interrupted when he is joining!");
}
});
t1.start();
t2.start();
t2.interrupt();
logger.info("this is the end");
}
执行结果: