加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Java线程池简析

发布时间:2021-07-06 05:27:53 所属栏目:大数据 来源: https://blog.csdn.net/j123123
导读:一. 线程池的好处 合理利用线程池能够带来三个好处。 1.降低资源消耗。 通过重复利用已创建的线程,降低线程创建和销毁造成的消耗。 2.提高响应速度。 当任务到达时,任务可以不需要的等到线程创建就能立即执行。 3.提高线程的可管理性。 线程是稀缺资源,如

一. 线程池的好处

合理利用线程池能够带来三个好处。

1.降低资源消耗。

通过重复利用已创建的线程,降低线程创建和销毁造成的消耗。

2.提高响应速度。

当任务到达时,任务可以不需要的等到线程创建就能立即执行。

3.提高线程的可管理性。

线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。


二. Java线程池参数解析

Java 提供的线程池相关的工具类中,最核心的是 ThreadPoolExecutor,完备的构造函数有 7 个参数,如下所示:

ThreadPoolExecutor(
 int corePoolSize,
 int maximumPoolSize,
 long keepAliveTime,
 TimeUnit unit,
 BlockingQueue<Runnable> workQueue,
 ThreadFactory threadFactory,
 RejectedExecutionHandler handler) 

1.corePoolSize:线程池的最小线程数。

默认情况下,线程池创建后的初始线程数为 0,当有任务到来就会创建一个线程去执行任务,当线程池中的线程数目达到 corePoolSize,就会把到达的任务放到缓存队列当中。

2.maximumPoolSize:线程池的最大线程数。

表示在线程池中最多能创建多少个线程。

3.keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。

默认情况下,当线程池中的线程数大于 corePoolSize 时,如果一个线程空闲的时间达到
keepAliveTime,则该线程会终止,直到线程池中的线程数不超过 corePoolSize
.
但是如果调用了 allowCoreThreadTimeOut(boolean) 方法,此时就算线程池中的线程数不大于
corePoolSizekeepAliveTime 参数也会起作用,直到线程池中的线程数为 0。

4.unit:参数 keepAliveTime 的时间单位。

有7种取值,在 TimeUnit 类中有7种静态属性:

TimeUnit.DAYS;               //天
TimeUnit.HOURS;             //小时 
TimeUnit.MINUTES;           //分钟 
TimeUnit.SECONDS;           //秒
TimeUnit.MILLISECONDS;      //毫秒 
TimeUnit.MICROSECONDS;      //微妙
TimeUnit.NANOSECONDS;       //纳秒 

5.workQueue:任务阻塞队列,用来存储等待执行的任务。

分为 ArrayBlockingQueueLinkedBlockingQueueSynchronousQueue 三种类型。

6.threadFactory:用于创建新线程的线程工厂。

可以通过这个参数自定义如何创建线程,例如可以给线程指定一个有意义的名字。

7.handler:拒绝处理任务时的拒绝策略。

如果线程池中所有的线程都在忙碌,并且工作队列也满了(前提是工作队列是有界队列),那么此时提交任务,线程池就会拒绝接收。拒绝策略可以通过 handler 参数来指定。
.
ThreadPoolExecutor 提供了以下4种拒绝策略。

  • CallerRunsPolicy:提交任务的线程自己去执行该任务。

  • AbortPolicy:默认的拒绝策略,会 throws RejectedExecutionException。

  • DiscardPolicy:直接丢弃任务,没有任何异常抛出。

  • DiscardOldestPolicy:丢弃最老的任务,就是把最早进入工作队列的任务丢弃,然后把新任务加入到工作队列。


三. Java线程池工作流程

在这里插入图片描述

四. Java 中提供的常用线程池

Executors 类提供了4种不同的线程池:

  • newCachedThreadPool:用来创建一个可以无限扩大的线程池,适用于负载较轻的场景,执行短期异步任务。(可以使任务快速得到执行,因为任务时间执行短,可以很快结束,也不会造成cpu过度切换)

  • newFixedThreadPool:创建一个固定大小的线程池,因为采用无界的阻塞队列,所以实际线程数量永远不会变化,适用于负载较重的场景,对当前线程数量进行限制。(保证线程数可控,不会造成线程过多,导致系统负载更为严重)

  • newSingleThreadExecutor:创建一个单线程的线程池,适用于需要保证顺序执行各个任务。

  • newScheduledThreadPool:适用于执行延时或者周期性任务。

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读