分两种:
1.ThreadPoolExecutor
2.ForkJoinPool 分解汇总
ThreadPool线程池,维护着两个集合:线程集合,任务队列
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,4,
60,TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(4),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy());
ThreadPoolExecutor七个参数:
1.核心线程数(corePoolSize):默认不参与归还操作系统,有参数可以指定是否归还 2.最大线程数(maximumPoolSize):线程不够时,能扩展到最多是多少 3.生存时间(keepAliveTime):指定线程多长时间不工作,需要归还给操作系统 4.生存时间的单位 5.任务队列:上面例子队列最多装4个任务 6.线程工厂:产生线程 7.拒绝策略:一开始线程池中没有任何线程,来一个任务起一个线程,紧接着来一个任务再起一个线程,当第三个任务来了,2个核心线程都忙着时,则加入任务队列,当任务队列满了(4个),核心线程依然忙着时,起新的线程。当第九个任务来时,如果所有线程都忙着,任务队列也满着,此时执行拒绝策略。 拒绝策略可以自定义,JDK默认提供四种: -1.Abort:抛异常 -2.Discard:扔掉,不抛异常 -3.DiscardOldest:扔掉排队时间最久的 -4.CallerRuns:调用者处理任务,哪个线程调用了线程池的execute()方法,哪个线程去处理