基于JDK8总结java中的interrupt
1.interrupt知识点
以下总结基于JDK8
本文不会完整说明interrupt,只会罗列一些比较重要的点。完整了解Thread.interrupt可以看参考资料。
以下的一些理解新的有助于理解参考资料的文章:
interrupt方法调用后,针对BLOCKED状态的线程,只是设定中断标志位为true。是否响应中断(感知这个标志位的变化)取决于API的设计。JDK的阻塞IOAPI、Synchronized同步块、还有Lock中的很多方法(不包括lockInterruptibly)都是不响应中断的。当然调用线程可以利用标志位判断来使得自己设计的API是可响应中断的。
interrupt方法调用后,针对WAITING/TIMED_WAITING状态的线程,会上抛interruptedException**并且设置中断标志位false**。例如线程调用Thread.sleep,Object.wait()之后。
如果线程尚未启动(NEW),或者已经结束(TERMINATED),则调用interrupt()对它没有任何效果,中断标志位也不会被设置。
最佳实践:有时候一些方法设计上不允许被中断或者取消,但是当别的线程发来中断请求的时候,也需要进行标记的保留,方便其他调用方“了解情况”
publicTaskgetNextTask(BlockingQueuequeue){ booleaninterrupted=false; try{ while(true){ try{ returnqueue.take(); }catch(InterruptedExceptione){ //fianlly中依赖的状态标记 interrupted=true; //fallthroughandretry } } }finally{ if(interrupted) //在fianlly中重新标记,确保没有丢失中断通知 Thread.currentThread().interrupt(); } }
利用中断可以实现一些cancel的操作。例如:
packageconcurrent; importjava.util.concurrent.BlockingQueue; importjava.util.concurrent.Callable; importjava.util.concurrent.ExecutorService; importjava.util.concurrent.Executors; /** *Createdbywanshao *Date:2017/12/18 *Time:下午3:42 **/ publicclassInterruptExample{ publicstaticvoidmain(String[]args)throwsInterruptedException{ InterruptTaskinterruptTask=newInterruptTask(); ExecutorServiceexecutorService=Executors.newSingleThreadExecutor(); executorService.submit(interruptTask); Thread.sleep(100); interruptTask.cancel(); executorService.shutdown(); } } /** *一个响应中断的任务 */ classInterruptTaskimplementsCallable{ privateBlockingQueue queue; //保存要被interrupt的线程 Threadt; @Override publicIntegercall()throwsInterruptedException{ System.out.println("startablockedtask"); try{ t=Thread.currentThread(); Thread.currentThread().sleep(50000); }catch(InterruptedExceptione){ System.out.println("beinterrupted"); e.printStackTrace(); } return0; } publicvoidcancel(){ System.out.println("cacelatask...."); //这里直接调用Thread.currentThread()会获取到main线程,而不是线程池里面的线程 if(!t.isInterrupted()){ t.interrupt(); } } }
总结
以上所述是小编给大家介绍的基于JDK8总结java中的interrupt,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!