Java:谈谈线程池的使用?
简介
线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。核心参数
1、核心线程数
2、最大线程数
3、空闲线程最大存活时间
4、时间单位
5、线程等待队列
5、线程工厂
6、饱和策略
饱和策略
1、ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 【默认】
2、ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。
3、ThreadPoolExecutor.DiscardOldestPolicy:丢弃线程队列的中最先进来的任务,将新的任务添加到队列中。
4、ThreadPoolExecutor.CallerRunsPolicy:由调用线程来处理该任务。
创建线程池
ExecutorService temp = new ThreadPoolExecutor( 2, 5, 3, TimeUnit.SECONDS, new LinkedBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardOldestPolicy());
获取线程,执行任务
temp.submit(Runnable task);
线程池执行流程:
JDK内置线程池
通过Executors对象可以获取:
1、FixedThreadPool:线程数固定的线程池;
2、CachedThreadPool:线程数根据任务动态调整的线程池;
3、SingleThreadExecutor:仅单线程执行的线程池;
....
提问:为何不推荐使用jdk内置线程池?
回答:因为内置线程池底层设计中,对线程数量或等待队列长度的设置为 Integer.MAX_VALUE ,存在OOM(内存泄漏)风险。