构造方法
//参数最全的构造方法
public ThreadPoolExecutor(int corePoolSize,//核心线程数
int maximumPoolSize,//最大线程数
long keepAliveTime,//非核心线程最长等待新任务的时间
TimeUnit unit,//时间单位
BlockingQueue<Runnable> workQueue,//线程池的任务队列(阻塞队列),
ThreadFactory threadFactory,//线程工厂--线程创建的方案
RejectedExecutionHandler handler//拒绝策略--描述了当线程池任务队列满了, 如果继续添加任务会以什么样的方式处理
){}
// 其他的构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue){}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler){}
拒绝策略
修饰符类型 | 拒绝策略类型 | 拒绝策略描述 |
static class | ThreadPoolExecutor.AbortPolicy | 如果任务太多, 队列满了, 直接抛出异常RejectedExecutionException(拒绝执行异常) |
static class | ThreadPoolExecutor.CallerRunsPolicy | 如果任务太多, 队列满了, 多出来的任务, 谁加的, 谁负责执行 |
static class | ThreadPoolExecutor.DiscardOldestPolicy | 如果任务太多, 队列满了, 丢弃最旧的未处理的任务 |
static class | ThreadPoolExecutor.DiscardPolicy | 如果任务太多, 队列满了, 丢弃多出来的任务 |
创建线程池Demo
package com.qlx.thread;
import java.util.concurrent.*;
/**
* @Description ThreadPoolStudy
* @Author Timing
* @Date 2023/11/03 14:40
*/
public class ThreadPoolStudy {
public static void main(String[] args) {
//创建一个固定数量的线程池
// 1. 创建一个操作无界队列且固定大小线程池
ExecutorService pool1 = Executors.newFixedThreadPool(10);
//线程池中线程的数量是动态变化的
// 2. 用来处理大量短时间工作任务的线程池,如果池中没有可用的线程将创建新的线程,如果线程空闲60秒将收回并移出缓存
ExecutorService pool2 = Executors.newCachedThreadPool();
//线程池中只有一个线程
// 3. 创建一个操作无界队列且只有一个工作线程的线程池
ExecutorService pool3 = Executors.newSingleThreadExecutor();
//线程池中只有一个线程+定时器功能
// 4. 创建一个单线程执行器,可以在给定时间后执行或定期执行。
ExecutorService pool4 = Executors.newSingleThreadScheduledExecutor(Executors.defaultThreadFactory());
//创建一个固定数量的线程池+定时器功能
// 5. 创建一个指定大小的线程池,可以在给定时间后执行或定期执行。
ExecutorService pool5 = Executors.newScheduledThreadPool(3, Executors.defaultThreadFactory());
// 6. 创建一个指定大小(不传入参数,为当前机器CPU核心数)的线程池,并行地处理任务,不保证处理顺序
ExecutorService pool6 = Executors.newWorkStealingPool();
// 7. 自定义线程池
ExecutorService pool7 = new ThreadPoolExecutor(3, 10, 10000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
}
上面代码中前6种创建方式, 都是使用Executors(线程池的工具类)调用一个方法返回一个对象来创建线程池对象, 与第7种直接new对象的方式不同, 通过前6种方式创建出来的线程池, 本质上也是通过包装ThreadPoolExecutor来实现出来的
标签:ExecutorService,Java,Executors,int,创建,队列,线程,多线程 From: https://blog.51cto.com/u_15978361/8174454