package cn.hutool.core.thread;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 线程池工具
*
* @author luxiaolei
*/
public class ThreadUtil {
/**
* 新建一个线程池
*
* @param threadSize 同时执行的线程数大小
* @return ExecutorService
*/
public static ExecutorService newExecutor(int threadSize) {
return ExecutorBuilder.create().setCorePoolSize(threadSize).build();
}
/**
* 获得一个新的线程池
*
* @return ExecutorService
*/
public static ExecutorService newExecutor() {
return ExecutorBuilder.create().setWorkQueue(new SynchronousQueue()).build();
}
/**
* 获得一个新的线程池,只有单个线程
*
* @return ExecutorService
*/
public static ExecutorService newSingleExecutor() {
return Executors.newSingleThreadExecutor();
}
/**
* 获得一个新的线程池
* 如果maximumPoolSize =》 corePoolSize,在没有新任务加入的情况下,多出的线程将最多保留60s
*
* @param corePoolSize 初始线程池大小
* @param maximumPoolSize 最大线程池大小
* @return {@link ThreadPoolExecutor}
*/
public static ThreadPoolExecutor newExecutor(int corePoolSize, int maximumPoolSize) {
return ExecutorBuilder.create().setCorePoolSize(corePoolSize).setMaxPoolSize(maximumPoolSize).build();
}
/**
* 获得一个新的线程池
* 传入阻塞系数,线程池的大小计算公式为:CPU可用核心数 / (1 - 阻塞因子)
* Blocking Coefficient(阻塞系数) = 阻塞时间/(阻塞时间+使用CPU的时间)
* 计算密集型任务的阻塞系数为0,而IO密集型任务的阻塞系数则接近于1。
*
* see: http://blog.csdn.net/partner4java/article/details/9417663
*
* @param blockingCoefficient 阻塞系数,阻塞因子介于0~1之间的数,阻塞因子越大,线程池中的线程数越多。
* @return {@link ThreadPoolExecutor}
* @since 3.0.6
*/
public static ThreadPoolExecutor newExecutorByBlockingCoefficient(float blockingCoeffi