时间:2021-05-19
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,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java8、jdk8日期转化成字符串新建日期工具类:DateUtils新建方法:parseDate实现方法parseDatepublicstaticString
1.1JDK14详细概述JDK8已经在2014年3月18日正式可用,JDK8作为长期支持(Long-Term-Support)版本,距离现在已经5年多时间过去了
Java9才发布几个月,很多玩意都没整明白,现在Java10又要来了。这时候我真想说:线上用的JDK7,甚至JDK6,而JDK8还没用熟,JDK9才发布不久不知
安装tomcat之前请一定先安装java,然后才能安装tomcat。安装java、环境变量path的设置以及cmd小技巧请看:java新手环境搭建jdk8安装配
JDK8的新特性中TimeAPI,其包括Clock、Duration、Instant、LocalDate、LocalTime、LocalDateTime、Zon