ad thisThread = Thread.currentThread();
leader = thisThread;
try {
available.awaitNanos(delay);
} finally {
if (leader == thisThread)
leader = null;
}
}
}
}
} finally {
if (leader == null && queue[0] != null)
available.signal();
lock.unlock();
}
}
这两个定时方法一个以任务开始为周期起点、另一个以任务结束为周期起点
获取定时任务的流程是相同的,只是它们构建的定时任务中延迟的时间不同
定时任务使用period
区别,为正数周期起点为任务开始,为负数时周期起点为任务结束
总结
本篇文章围绕线程池,深入浅出的讲解池化技术,Executor,线程池的参数、配置、实现原理、处理异常、关闭等
使用池化技术能够节省频繁创建、关闭的开销,提升响应速度,方便管理,常应用于线程池、连接池等
Executor框架将工作任务与执行(线程池)解耦分离,工作任务分为无返回值的Runnable
和有返回值的Callable
Executor实际只处理Runnable
任务,会将Callable
任务封装成FutureTask
适配Runnable
执行
线程池使用工作队列来管理线程,线程执行完任务会从阻塞队列取任务执行,当非核心线程空闲一定时间后会被关闭
线程池执行时,如果工作队列线程数量小于核心线程数,则创建线程来执行(相当预热)
如果工作队列线程数量大于核心线程数量,并且阻塞队列未满则放入阻塞队列
如果阻塞队列已满,还未达到最大线程数量则创建非核心线程执行任务
如果已达到最大线程数量则使用拒绝策略
配置参数CPU密集型为CPU核数+1;IO密集型为2倍CPU核数;具体配置需要测试
处理异常可以直接捕获任务,Callable
可以捕获get,也可以继承线程池实现afterExecutor
记录异常,还可以在创建线程时就设置处理未捕获异常方法
处理定时任务的线程池由延迟队列实现,时间越短的定时任务越先执行,线程会从延迟队列中获取定时任务(时间已到的情况),时间未到就等待
最后(不要白嫖,一键三连求求拉~)
本篇文章被收入专栏 由点到线,由线到面,深入浅出构建Java并发编程知识体系,感兴趣的同学可以持续关注喔
本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~
案例地址:
Gitee-JavaConcurrentProgramming/src/main/java/D_ThreadPool
Github-JavaConcurrentProgramming/src/main/java/D_ThreadPool
有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~
关注菜菜,分享更多干货,公众号:菜菜的后端私房菜
本文由博客一文多发平台 OpenWrite 发布!