构建七个参数的线程池,
public static final ThreadPoolExecutor threadPoolExecutor
= new ThreadPoolExecutor(
10, //corePoolSize
20, //maximumPoolSize
60, //keepAliveTime
TimeUnit.SECONDS, //TimeUnit
new LinkedBlockingQueue<Runnable>(), //BlockingQueue<Runnable>
Executors.defaultThreadFactory(), //ThreadFactory
new ThreadPoolExecutor.CallerRunsPolicy()); //RejectedExecutionHandler
corePoolSize大小:
一般需要根据任务的类型来配置线程池大小:
如果是CPU密集型任务,应配置尽可能小的线程,参考值可以设为 NCPU+1
如果是IO密集型任务,由于IO密集型任务中线程并不是一直在执行任务,则应配置尽可能多的线程,参考值可以设置为2*NCPU
具体的设置需要根据实际情况进行调整,比如可以先将线程池大小设置为参考值,再观察任务运行情况和系统负载、资源利用率来进行适当调整。
ThreadFactory
Executors提供的默认的实现
/**
* The default thread factory
*/
static class DefaultThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
DefaultThreadFactory() {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
}
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
我们可以参考它来实现自己的线程工厂并重命名,也可以使用guava的ThreadFactoryBuilder()来创建
public static ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("pay-verify-task-%d").build();
拒绝策略
AbortPolicy | 默认:直接抛出RejectedExecutionException异常 |
CallerRunsPolicy | 任务被拒绝添加后,会调用当前线程池的所在的线程去执行被拒绝的任务 |
DiscardPolicy | 直接抛弃,不会抛异常也不会执行 |
DiscardOldestPolicy | 抛弃任务队列中最旧的任务也就是最先加入队列的,再把这个新任务添加进去 |
参考文章:Java并发编程:线程池的使用 https://www.cnblogs.com/dolphin0520/p/3932921.html