interrupt()方法介绍
interrupt() 给目标线程发送一个中断信号,同时将目标线程的中断标志设置为true。至于目标线程是否做出响应,需要看目标线程是否有对应的中断业务逻辑。
场景1:
假设,你是一个工厂的老板(main线程),招了一个工人(小王)为你干活,到了中午饭点的时间需要通知工人吃饭了。
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(()->{
while (true){
if(Thread.currentThread().isInterrupted()){
System.out.println("老板通知:" + Thread.currentThread().getName() + "该吃饭了!!!");
break;
}
}
});
worker.setName("小王");
worker.start();
log.info("老板发话:小王该上班了,抓紧干活!!!");
Thread.sleep(1000);
log.info("老板发话:小王到饭点了!!!");
worker.interrupt();
}
运行结果:
场景2:
小王(worker)吃完了中午饭,需要睡(sleep)一会,老板下午通知接着干活。
public static void main(String[] args){
Thread worker = new Thread(()->{
try{
Thread.sleep(1000);
}catch (InterruptedException interruptedException){
log.error("小王说道:知道了,别墨迹了",interruptedException);
}
});
worker.setName("小王");
worker.start();
log.info("老板发话:小王睡醒了没,抓紧干活!!!");
worker.interrupt();
}
运行结果:
isInterrupted()方法介绍
isInterrupted() 检查目标线程是否被标记了中断标志,不会改变目标线程的中断标志。
场景:
小王一门心思,只想工作,即使老板通知吃饭,小王也不想吃饭,满脑子只想工作,一直处于while循环中,小王不断回想起老板通知自己吃饭。
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(()->{
while (true){
if(Thread.currentThread().isInterrupted()){
System.out.println("小王收到老板通知吃饭,但是委婉的拒绝了,工作要紧!!!");
}
}
});
worker.setName("小王");
worker.start();
log.info("老板发话:小王该上班了,抓紧干活!!!");
Thread.sleep(1000);
log.info("老板发话:小王到饭点了,先吃饭吧!!!");
worker.interrupt();
}
运行结果:
interrupted()方法介绍
interrupted() 检查目标线程的中断状态,如果目标线程中断标识是true,执行该方法后会将中断标识改为false,恢复到最开始的中断标志位。
还是和上述isInterrupted方法例子一样,我们把isInterrupted换成interrupted看下效果:
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(()->{
while (true){
if(Thread.interrupted()){
System.out.println(Thread.currentThread().getName()+"小王收到老板通知吃饭,但是委婉的拒绝了,工作要紧!!!");
}
}
});
worker.setName("小王");
worker.start();
log.info("老板发话:小王该上班了,抓紧干活!!!");
Thread.sleep(1000);
log.info("老板发话:小王到点了,先吃饭吧!!!");
worker.interrupt();
}
运行结果:
可以看出,刚刚的那句话只打印了一次,因为interrupted会恢复线程的中断标识,由true改成false,这样第二次和后面的循环过程中,就不会进到打印语句,只有第一次才会进到if的逻辑。