内容简介:Java线程池(以线程池参数最多的构造函数(线程池的存在,默认会阻止主程序的自动退出。销毁掉线程池中的全部线程后,主程序才可以顺利退出。
Java线程池( java.util.concurrent.ThreadPoolExecutor
)实现了接口 java.util.concurrent.ExecutorService
,将线程资源缓存起来,实现了线程的复用。
示例代码
package bj; import io.vavr.control.Try; import java.time.LocalTime; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; import java.util.stream.IntStream; /** * Created by BaiJiFeiLong@gmail.com at 2018/12/7 上午10:05 */ public class FooTest { public static void main(String[] args) { ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 6, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<>(3), new ThreadFactory() { private int count = 0; @Override public Thread newThread(Runnable r) { return new Thread(r, String.format("Thread[%d]", ++count)); } }, (r, executor1) -> System.out.println("Ignored: " + r)); executor.allowCoreThreadTimeOut(true); IntStream.range(0, 10).forEach($ -> executor.execute(() -> { Try.run(() -> Thread.sleep(1000)).getOrElseThrow((Supplier<RuntimeException>) RuntimeException::new); System.out.println(String.format("%s Progress: %d Thread: %s", LocalTime.now(), $, Thread.currentThread().getName())); })); } }
示例输出
Ignored: bj.FooTest$$Lambda$3/783286238@27082746 14:13:53.247 Progress: 0 Thread: Thread[1] 14:13:53.247 Progress: 2 Thread: Thread[3] 14:13:53.247 Progress: 8 Thread: Thread[6] 14:13:53.247 Progress: 3 Thread: Thread[4] 14:13:53.248 Progress: 1 Thread: Thread[2] 14:13:53.248 Progress: 7 Thread: Thread[5] 14:13:54.252 Progress: 5 Thread: Thread[6] 14:13:54.252 Progress: 6 Thread: Thread[3] 14:13:54.252 Progress: 4 Thread: Thread[1] Process finished with exit code 0
线程池各参数讲解
以线程池参数最多的构造函数( java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue<java.lang.Runnable>, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler)
)为例
- corePoolSize 核心池大小。核心池直接开辟空间
- maximumPoolSize 最大池(核心池+普通池)大小 线程数量超过这个大小,会拒绝执行
- keepAliveTime 线程存活时间 线程过了存活时间会自动销毁,默认情况下核心池例外
- unit 线程存活时间单位
- workQueue 工作队列 任务会在workQueue排队
- threadFactory 线程工厂 如何创建线程。可以指定线程名称、记录日志等
- handler 拒绝执行策略 默认抛异常,不执行
线程池基本工作流程
- 创建线程池,核心池分配满线程
- 新任务进入,放入核心池,开始执行
- 新任务进入,核心池已满,放入执行队列
- 新任务进入,执行队列已满,新任务放入普通池立即执行
- 新任务进入,线程数量超过最大池大小,拒绝执行
- 任务执行完毕,进入等待状态。普通池的线程超时后自动销毁
-
如果
allowCoreThreadTimeOut
设为true
,核心池中的线程超时后自动销毁
示例程序中,各任务的流向
- 任务1,放入核心池执行
- 任务2,放入核心池执行
- 任务3,放入核心池执行
- 任务4,放入核心池执行
- 任务5,核心池已满,放入执行队列等待
- 任务6,核心池已满,放入执行队列等待
- 任务7,核心池已满,放入执行队列等待
- 任务8,核心池和指定队列都已满,放入普通池立即执行
- 任务9,核心池和指定队列都已满,放入普通池立即执行
- 任务10, 核心池+普通池已达上限,任务被拒绝执行
线程池任务执行完成后自动销毁全部线程
线程池的存在,默认会阻止主程序的自动退出。销毁掉线程池中的全部线程后,主程序才可以顺利退出。
实现线程池任务全部接触后,自动销毁全部线程,有两种方式:
executor.allowCoreThreadTimeOut(true); executor.setCorePoolSize(0);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- java中线程安全,线程死锁,线程通信快速入门
- ObjC 多线程简析(一)-多线程简述和线程锁的基本应用
- Java多线程之线程中止
- Android 的线程和线程池
- iOS 多线程之线程安全
- java多线程 线程安全问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。