风一更--软件开发--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 需要定制.