线程池
发布日期:2021-06-27 12:56:03 浏览次数:25 分类:技术文章

本文共 3141 字,大约阅读时间需要 10 分钟。

文章目录

概述

线程池就是一个容纳多个线程的容器,池中的线程可以反复使用,省去了频繁创建线程对象的操作,节省了大量的时间和资源。

优点:

  • 降低资源消耗
  • 提高响应速度
  • 提高线程的可管理性

四种线程池

1.缓存线程池

/**     * 缓存线程池.     * (长度无限制)     * 执行流程:     * 1. 判断线程池是否存在空闲线程     * 2. 存在则使用     * 3. 不存在,则创建线程 并放入线程池, 然后使用     */ExecutorService service = Executors.newCachedThreadPool();//向线程池中 加入 新的任务service.execute(new Runnable() {
@Overridepublic void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName()); } }); service.execute(new Runnable() {
@Overridepublic void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName()); } }); service.execute(new Runnable() {
@Overridepublic void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName()); } });

定长线程池

/** * 定长线程池. * (长度是指定的数值) * 执行流程: * 1. 判断线程池是否存在空闲线程 * 2. 存在则使用 * 3. 不存在空闲线程,且线程池未满的情况下,则创建线程 并放入线程池, 然后使用 * 4. 不存在空闲线程,且线程池已满的情况下,则等待线程池存在空闲线程 */ExecutorService service = Executors.newFixedThreadPool(2);service.execute(new Runnable() {
@Overridepublic void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName()); } }); service.execute(new Runnable() {
@Overridepublic void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName()); } });

单线程线程池

// 效果与定长线程池 创建时传入数值1 效果一致./** * 单线程线程池. * 执行流程: * 1. 判断线程池 的那个线程 是否空闲 * 2. 空闲则使用 * 4. 不空闲,则等待 池中的单个线程空闲后 使用 */        ExecutorService service = Executors.newSingleThreadExecutor();service.execute(new Runnable() {
@Overridepublic void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName()); } }); service.execute(new Runnable() {
@Overridepublic void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName()); } });

周期性任务定长线程池

public static void main(String[] args) {
/** * 周期任务 定长线程池. * 执行流程: * 1. 判断线程池是否存在空闲线程 * 2. 存在则使用 * 3. 不存在空闲线程,且线程池未满的情况下,则创建线程 并放入线程池, 然后使用 * 4. 不存在空闲线程,且线程池已满的情况下,则等待线程池存在空闲线程 * * 周期性任务执行时: * 定时执行, 当某个时机触发时, 自动执行某任务 . */ ScheduledExecutorService service = Executors.newScheduledThreadPool(2);/** * 定时执行 * 参数1. runnable类型的任务 * 参数2. 时长数字 * 参数3. 时长数字的单位 *//*service.schedule(new Runnable() {@Overridepublic void run() {System.out.println("俩人相视一笑~ 嘿嘿嘿");}},5,TimeUnit.SECONDS);*//** * 周期执行 * 参数1. runnable类型的任务 * 参数2. 时长数字(延迟执行的时长) * 参数3. 周期时长(每次执行的间隔时间) * 参数4. 时长数字的单位 */ service.scheduleAtFixedRate(new Runnable() {
@Override public void run() {
System.out.println("俩人相视一笑~ 嘿嘿嘿"); } },5,2,TimeUnit.SECONDS); }

线程池的种类以及使用场景

1.CachedThreadPool

可根据实际情况,调整线程数量的线程池,线程池中的线程数量不确定,如果有空闲线程会优先选择空闲线程,如果没有空闲线程并且此时有任务提交会创建新的线程。在正常开发中并不推荐这个线程池,因为在极端情况下,会因为 newCachedThreadPool 创建过多线程而耗尽 CPU 和内存资源。

2.FixedThreadPool

创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

3.ScheduledThreadPool

此线程池可以指定固定数量的线程来周期性的去执行。比如通过 scheduleAtFixedRate 或者 scheduleWithFixedDelay 来指定周期时间。

4.SingleThreadPool

创建一个线程的线程池,在这个线程池中始终只有一个线程存在。如果线程池中的线程因为异常问题退出,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

转载地址:https://blog.csdn.net/weixin_43454088/article/details/117340416 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:关于计算机网络
下一篇:Runnable与Callable

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月12日 00时45分47秒