多线程之线程池

首先说一说线程池的优点:

  1. 方便管理,监控线程状态
  2. 提高线程响应速度
  3. 线程可以重复使用

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
    应用场景:需要执行定时任务的场合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值