概述
首先说一说线程池的优点:
- 方便管理,监控线程状态
- 提高线程响应速度
- 线程可以重复使用
ExecutorService普通调度池核心接口
- submit(Runnable||Callable):Future
- Execute(Runnable):void
线程池工作流程:当任务到达线程池时的工作顺序,首先补充下面概念:
- 核心线程池corePool Size
- 阻塞队列BlockingQueue
- 最大线程池maxiumPoolSize
- 拒绝策略rejectHandler
然后是工作顺序:
1.若核心池未满,则创建新的线程执行任务而后将此线程入核心池
-若核心池满且有空闲线程,调度空闲线程执行任务。
2.将任务置入阻塞队列,排队等待空闲线程调度(juc)
-ArrayBlockingQueue:基于数组的有界阻塞队列
-LinkedBlockingQueue:基于链表的无界阻塞队列
-SynchrousQueue:不存储元素的无界阻塞队列
3.当阻塞队列满时,若此时最大线程池未满,创建新线程执行任务而后置入最大线程池中
4.若最大线程池已满,调用相应拒绝策略处理任务(默认为抛出异常且不处理任务)
手工创建线程池 new ThreadPoolExecutor()
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue)
手工创建线程池执行Callable任务
Thread 类执行Callable FutureTask
FutureTask类保证多线程场景下任务只会被执行一次
Future get()会阻塞当前线程直到取得Callable的返回值
JDK内置4大线程池
- 固定大小线程池:LinkedBlokingQueue
应用场景:当服务器负载较重时,限制线程产生数量,可采用固定大小线程池
- 单线程池:newSingleThreadExecutor
应用场景:某些需要同步处理的场合(任务需要按需处理)
- 缓存线程池:newCatchdThreadPool
应用场景:短期小任务,负载不大
SynchronousQueue:不存储元素。入,出对操作必须同时调用,
当提交任务速度>执行任务速度:会不代表创建新线程执行任务,内存可能会写满
当提交任务速度<执行任务速度:固定几个线程来处理
- 定时调度池:newScheduledThreadPool
应用场景:需要执行定时任务的场合
最后
以上就是酷炫身影为你收集整理的多线程之线程池的全部内容,希望文章能够帮你解决多线程之线程池所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复