1、线程池处理Runnable任务
1.1、ThreadPoolExecutor创建线程池对象示例
ExecutorService pools = new ThreadPoolExecutor(3,5,8,TimeUnit.SECONDS,new ArrayBlockingQueue<>(6),Executors.defaultFactory(),new ThreadPoolExecutor.AbortPolicy));
1.2、ExecutorService的常用方法
方法名称 说明 void execute(Runnable command) 执行任务/命令,没有返回值,一般用来执行 Runnable 任务 Future<T> submit(Callable<T> task) 执行任务,返回未来任务对象获取线程结果,一般拿来执行 Callable 任务 void shutdown() 等任务执行完毕后关闭线程池 List<Runnable> shutdownNow()
立刻关闭,停止正在执行的任务,并返回队列中未执行的任务 1.3、新任务拒绝策略
策略 详解 ThreadPoolExecutor.AbortPolicy
丢弃任务并抛出RejectedExecutionException异常。是默认的策略 ThreadPoolExecutor.DiscardPolicy 丢弃任务,但是不抛出异常 这是不推荐的做法 ThreadPoolExecutor.DiscardOldestPolicy 抛弃队列中等待最久的任务 然后把当前任务加入队列中 ThreadPoolExecutor.CallerRunsPolicy 由主线程负责调用任务的run()方法从而绕过线程池直接执行
1.4、代码演示
package com.atguigu.juc; import java.util.concurrent.*; /* 目标:自定义一个线程池对象,并测试其特性。 */ public class ThreadPoolDemo1 { public static void main(String[] args) { //1、创建线程池对象 ExecutorService pool = new ThreadPoolExecutor(3, 5, 6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); //2、给任务线程池处理 Runnable target = new Runnable() { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "正在执行任务" + i); } } }; pool.execute(target); pool.execute(target); pool.execute(target); } }
pool-1-thread-3正在执行任务0 pool-1-thread-1正在执行任务0 pool-1-thread-1正在执行任务1 pool-1-thread-1正在执行任务2 pool-1-thread-1正在执行任务3 pool-1-thread-1正在执行任务4 pool-1-thread-2正在执行任务0 pool-1-thread-3正在执行任务1 pool-1-thread-3正在执行任务2 pool-1-thread-3正在执行任务3 pool-1-thread-3正在执行任务4 pool-1-thread-2正在执行任务1 pool-1-thread-2正在执行任务2 pool-1-thread-2正在执行任务3 pool-1-thread-2正在执行任务4
- 此时并没有创建临时线程,因为此时3个核心线程忙的过来,所以不会创建临时线程。