基于JDK8总结java中的interrupt
程序员文章站
2024-02-17 17:58:16
1. interrupt知识点
以下总结基于jdk8
本文不会完整说明interrupt,只会罗列一些比较重要的点。完整了解thread.interrupt...
1. interrupt知识点
以下总结基于jdk8
本文不会完整说明interrupt,只会罗列一些比较重要的点。完整了解thread.interrupt可以看参考资料。
以下的一些理解新的有助于理解参考资料的文章:
interrupt方法调用后,针对blocked状态的线程,只是设定中断标志位为true。是否响应中断(感知这个标志位的变化)取决于api的设计。jdk的阻塞io api、synchronized同步块、还有lock中的很多方法(不包括lockinterruptibly)都是不响应中断的。当然调用线程可以利用标志位判断来使得自己设计的api是可响应中断的。
interrupt方法调用后,针对waiting/timed_waiting状态的线程,会上抛interruptedexception**并且设置中断标志位false**。例如线程调用thread.sleep,object.wait()之后。
如果线程尚未启动(new),或者已经结束(terminated),则调用interrupt()对它没有任何效果,中断标志位也不会被设置。
最佳实践:有时候一些方法设计上不允许被中断或者取消,但是当别的线程发来中断请求的时候,也需要进行标记的保留,方便其他调用方“了解情况”
public task getnexttask(blockingqueue<task> queue) { boolean interrupted = false; try { while (true) { try { return queue.take(); } catch (interruptedexception e) { //fianlly中依赖的状态标记 interrupted = true; // fall through and retry } } } finally { if (interrupted) //在fianlly中重新标记,确保没有丢失中断通知 thread.currentthread().interrupt(); } }
利用中断可以实现一些cancel的操作。例如:
package concurrent; import java.util.concurrent.blockingqueue; import java.util.concurrent.callable; import java.util.concurrent.executorservice; import java.util.concurrent.executors; /** * created by wanshao * date: 2017/12/18 * time: 下午3:42 **/ public class interruptexample { public static void main(string[] args) throws interruptedexception { interrupttask interrupttask = new interrupttask(); executorservice executorservice = executors.newsinglethreadexecutor(); executorservice.submit(interrupttask); thread.sleep(100); interrupttask.cancel(); executorservice.shutdown(); } } /** * 一个响应中断的任务 */ class interrupttask implements callable<integer> { private blockingqueue<task> queue; //保存要被interrupt的线程 thread t; @override public integer call() throws interruptedexception { system.out.println("start a blocked task"); try { t = thread.currentthread(); thread.currentthread().sleep(50000); } catch (interruptedexception e) { system.out.println("be interrupted"); e.printstacktrace(); } return 0; } public void cancel() { system.out.println("cacel a task...."); //这里直接调用thread.currentthread()会获取到main线程,而不是线程池里面的线程 if (!t.isinterrupted()) { t.interrupt(); } } }
总结
以上所述是小编给大家介绍的基于jdk8总结java中的interrupt,希望对大家有所帮助