?在日常开发中,如果需要使用到多线程,最简单的方式是 new Thread,但是这种方式有很大弊端:
?相比于直接 new Thread,java提供了四种线程池,它的好处是:
?Java通过Executors提供了四种线程池,分别是:
?但实际上,实际开发中是不允许使用上面4类线程池的,而是要求我们自定义线程池。下面我们就看下Java自带线程池的缺点。
?下面这个代码案例,是开发当中比较常用常用的一个线程池,其中核心线程数是服务器内核数的3倍,最大线程数是服务器内核数的4倍,默认的任务队列数是10000个。
public class ThreadPoolUtil {
/**
* 获取当前系统可用的处理器核的数量
*/
private static final int CORE_NUM = Runtime.getRuntime().availableProcessors();
/**
* 默认任务队列长度
*/
private static final int DEFAULT_TASK_QUEUE_SIZE = 10000;
private ThreadPoolUtil() {
}
/**
* 核心线程内核3倍,最大线程内核4倍,60等待超时销毁线程
* 如果使用,线程数量需要考虑任务数量场景
*/
private static class ThreadPoolHolder {
private static final ThreadPoolExecutor INSTANCE = new ThreadPoolExecutor(CORE_NUM * 3, CORE_NUM * 4,
60, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(DEFAULT_TASK_QUEUE_SIZE),
new ThreadFactoryBuilder().setNameFormat("OrderDispatchThreadPool-%s").build(),
new ThreadPoolExecutor.CallerRunsPolicy());
}
public static ThreadPoolExecutor getInstance() {
return ThreadPoolHolder.INSTANCE;
}
public static Future async(Runnable task) {
return getInstance().submit(task);
}
public static Future async(Callable task) {
return getInstance().submit(task);
}
public static <P> Future async(Consumer<P> method, P param) {
return getInstance().submit(() -> method.accept(param));
}
/**
* 有两个参数但是无返回值的异步执行方法, 如void noStaticFoo(Long id,Entity entity)
*
* @param method 要执行的方法,如 , user::noStaticFoo
* @param param1 第一个入参值,如id
* @param param2 第二个入参值,如entity
* @param <P1> 第一个入参类型
* @param <P2> 第二个入参类型
* @return Future对象,用以判断是否执行结束
*/
public static <P1, P2> Future async(BiConsumer<P1, P2> method, P1 param1, P2 param2) {
return getInstance().submit(() -> method.accept(param1, param2));
}
/**
* 单个入参,有返回值的异步执行方法 , Entity noStaticFoo(Long id)
*
* @param method 要执行的方法,如 , user::noStaticFoo
* @param param 入参值,如 id
* @param <P> 入参类型,如Long
* @param <R> 返回值类型,如 Entity
* @return Future对象,用以判断是否执行结束、获取返回结果
*/
public static <P, R> Future<R> async(Function<P, R> method, P param) {
return getInstance().submit(() -> method.apply(param));
}
/**
* 两个入参,有返回值的异步执行方法 , Entity noStaticFoo(Long id)
*
* @param method 要执行的方法,如 , user::noStaticFoo
* @param param1 第一个入参值,如id
* @param param2 二个入参值,如entity
* @param <P1> 第一个入参类型
* @param <P2> 第二个入参类型
* @param <R> 返回值类型,如 Entity
* @return Future对象,用以判断是否执行结束、获取返回结果
*/
public static <P1, P2, R> Future<R> async(BiFunction<P1, P2, R> method, P1 param1, P2 param2) {
return getInstance().submit(() -> method.apply(param1, param2));
}
}