线程池

线程池的实现:

Executors类:线程池的工具类,通过调用方法返回不同类型的线程池对象
1、public static ExecutorService newCachedThreadPool(); 创建一个(理论上)没有上限的线程池
2、public static ExecutorService newFixedThreadPool(int nThreads); 创建有上限的线程池

1
2
3
4
5
6
7
ExecutorService pool = Executors.newCachedThreadPool();

pool.submit(new MyRunnable());//提交任务
pool.submit(new MyRunnable());
pool.submit(new MyRunnable());

//pool.shutdown();销毁线程池 一般不这么用

自定义线程池!

ThreadPoolExecutor

1
2
3
4
5
6
7
8
9
ThreadPoolExecutor pool = new ThreadPoolExecutor(
3,
6,
60,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);

核心参数(7个)

1、核心线程数
2、最大线程数
3、空闲线程最大存活时间(等待多久没有任务就销毁)
4、时间单位
5、任务队列
6、创建线程工厂
7、拒绝策略

拒绝策略(4个)

1、ThreadPoolExecutor.AbortPolicy 默认:丢弃任务并抛出RejectedExecutionExecption异常
2、ThreadPoolExecutor.DiscardPolicy 丢弃任务 不抛异常 不推荐
3、ThreadPoolExecutor.DiscardOldestPolicy 丢弃队列中等待最久的任务,然后把当前任务加入队列中
4、ThreadPoolExecutor.CallerRunsPolicy 调用任务的run()方法绕过线程池直接执行