风一更--软件开发--Java 多线程 线程池

目的:实现系统功能可用, 提高系统处理效率.

参考资料:

1.《Java 并发编程实战》


2023-01-11

1. newFixedThreadPool( int nThreads ) :

适用于计算密集型场景, 每个线程长时间忙碌,减少了线程创建,切换的开销. 

有OOM 风险, 

new ThreadPoolExecutor( nThreads  : corePoolSize, Integer.MAX_VALUE : maxCore, 0L: keepAliveTime, seconds: timeUnit, new LinkedBlockingQueue<Runnable>() );


2.newCachedThreadPool()

适用于高并发,任务处理实践短的场景.

new ThreadPoolExecutor( 0 : corePoolSize, Integer.MAX_VALUE : maxPoolSize, 60L : keepAliveTime, TimeUnit.SECOND : unit,

new SynchronousQueue<Runnabel>() )

 


single 


线程池各个状态切换图

Running  ; ShutDown ; Stop ; Tidying, Terminated

1.Running: 

  1.接收新来的任务.

  2.处理池中任务

  3.处理队列中的 任务

2.ShutDown,  由 running 执行 shutdown 得到

  1. 不接受新来的任务

  2. 处理池中的任务

  3.处理队列中的任务

3.Stop,  由 running 执行 shutdownNow 得到

   1.不接受新来的任务

  2.不处理池中的任务

  3.终止正在处理的队列中的任务.

4.Tidying

  terminate() 

5. terminated. 完全关闭.


2023-01-27

《JUC》 chapter 8 线程池的使用

N (threads) = N(cpu) * U (cpu 期望使用率 [0,1])  * ( 1 +  ( W wait time /  C compute time ))

N(cpu) = Runtime.getRuntime().availableProcessors();

Cached Fixed single scheduleSingle

BlockingQueue, 

有界队列: ArrayBlockingQueue, 有界的 LinkedBlockingQueue,  PriorityBlockingQueue, 有助于避免资源耗尽,要配合饱和策略。

无限制的线程池, SynchronousQueue 避免排队,线程之间移交的机制。可以拒绝任务。

 

饱和策略:

Caller-Runs 既不抛弃任务,也不抛出异常,而是将某些任务退回调用者,从而降低新任务的流量。

从线程池到工作队列,到应用程序,再到TCP 层,最终达到客户端,导致服务器在高负载下实现一种平缓的性能降低.

当工作队列被填满后,使用 Semaphore 来限制任务到达率。

 

ThreadFactory 需要定制.


 

posted @ 2023-01-11 10:16  君子之行  阅读(6)  评论(0)    收藏  举报