一、线程池的普通创建
我们也可以直接手动创建一个线程池 :
参数说明:
5条核心线程
10条最大线程
60秒回收空闲线程
其实就是把线程池里的子线程换成我们自己用线程工厂创建的线程,需要实现ThreadFactory 接口,重写newThread方法。
我们也可以直接手动创建一个线程池 :
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5,
10,
60,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(),
new MyThread(),
new ThreadPoolExecutor.AbortPolicy());
参数说明:
5条核心线程
10条最大线程
60秒回收空闲线程
单位:秒,和之前的60对应
自定义子线程
阻塞队列,上一篇博客已经讲到过
任务拒绝策略
这里只有两个参数是比较陌生的:自定义子线程和任务拒绝策略。
先说自定义子线程:
public class MyThread implements ThreadFactory {
@Override
public Thread newThread(@NonNull Runnable r) {
Thread thread = new Thread(r);
thread.setName("testThread");
return thread;
}
其实就是把线程池里的子线程换成我们自己用线程工厂创建的线程,需要实现ThreadFactory 接口,重写newThread方法。
然后是任务拒绝策略,当任务队列的任务满了,继续添加任务后,所执行的拒绝策略:
ThreadPoolExecutor.AbortPolicy():被拒绝后抛出RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy():被拒绝后给调用线程池的线程处理
ThreadPoolExecutor.DiscardOldestPolicy():被拒绝后放弃队列中最旧的未处理的任务
ThreadPoolExecutor.DiscardPolicy():被拒绝后放弃被拒绝的任务(当前新添加的任务)