关于java:线程池的四种创建方式执行逻辑说明

40次阅读

共计 1342 个字符,预计需要花费 4 分钟才能阅读完成。

1、newCachedThreadPool 创立可缓存线程池
创立线程数量没有限度,能够灵便回收线程,如果设置线程闲暇工夫 1 分钟,则该工作线程主动终止,终止后提交了新工作,就会再从新建设一个线程。
毛病是在应用 CachedThreadPool 时,肯定要留神管制工作的数量,否则,因为大量线程同时运行,很有会造成零碎瘫痪。
外围线程数为 0,非核心线程数为 MAX_VALUE,
队列不存储值,总认为队列是满的,所以每次执行工作时都会创立非核心线程,非核心线程闲暇了超过 60 秒(默认),就会主动回收。
2、newfixedThreadPool 创立定长的线程池
在达到长度之前,每提交一个工作都会创立一个线程,如果达到线程池最大数量,则提交到队列中,在闲暇的时候也不会主动回收线程
外围线程数为参数传入,非核心线程数和外围线程数一样,
队列为无界队列,资源无限的时候容易引起 OOM.
与 newSingledThreadPool 不同的是外围线程数不为 1.
3.newSingledThreadPool 创立繁多线程执行。
只有一个线程按程序执行工作,如果这个线程出现异常完结,会有另一个线程取代并按程序执行。
corepoolsize 外围线程数为 1,非核心线程数为 1,
队列为无界队列,
单工作线程最大的特点是可保障程序地执行各个工作,并且在任意给定的工夫不会有多个线程是流动的。
4.newScheduedThreadPool 创立一个定长的线程池,而且反对定时的以及周期性的工作执行,反对定时及周期性工作执行。如果提早 3 秒执行或每隔 3 秒执行一次
外围线程数为 参数设定,非核心线程数为 MAX_VALUE
定义了一个 DelayedWorkQueue,它是一个有序队列,会通过每个工作依照间隔下次执行工夫距离的大小来排序

线程池执行逻辑阐明:
判断外围线程数是否已满,外围线程数大小和 corePoolSize 参数无关,未满则创立线程执行工作
若外围线程池已满,判断队列是否满,队列是否满和 workQueue 参数无关,若未满则退出队列中
若队列已满,判断线程池是否已满,线程池是否已满和 maximumPoolSize 参数无关,若未满创立线程执行工作
若线程池已满,则采纳回绝策略解决无奈执执行的工作,回绝策略和 handler 参数无关
回绝策略
回绝策略 => 默认采纳的是 AbortPolicy 回绝策略,间接在程序中抛出 RejectedExecutionException 异样【因为是运行时异样,不强制 catch】,这种解决形式不够优雅。解决回绝策略有以下几种比拟举荐:
在程序中捕捉 RejectedExecutionException 异样,在捕捉异样中对工作进行解决。针对默认回绝策略
应用 CallerRunsPolicy 回绝策略,该策略会将工作交给调用 execute 的线程执行【个别为主线程】,此时主线程将在一段时间内不能提交任何工作,从而使工作线程解决正在执行的工作。此时提交的线程将被保留在 TCP 队列中,TCP 队列满将会影响客户端,这是一种平缓的性能升高
自定义回绝策略,只须要实现 RejectedExecutionHandler 接口即可
如果工作不是特地重要,应用 DiscardPolicy 和 DiscardOldestPolicy 回绝策略将工作抛弃也是可

正文完
 0