1.@Component注解将ThreadPoolUtil注入spring容器
2.容器启动后会首先执行@PostConstruct注解的initProcessorThreadPool方法,该方法初始化线程池配置
3.CountDownLatch count = new CountDownLatch(子线程数量);
使用多线程时,由于子线程都是异步执行的,所以要等所有子线程结束的话,可以用CountDownLatch阻塞主线程,子线程结束时通过countDown()方法减少计数值,切记countDown()要放在finally中,以防子线程异常中断导致的主线程一直阻塞;
@Component
public class ThreadPoolUtil {
@Value("${system-parameters.processor.corePoolSize:10}")
private int corePoolSize;
@Value("${system-parameters.processor.maximumPoolSize:10}")
private int maximumPoolSize;
private static ThreadPoolExecutor executor;
@PostConstruct
public void initProcessorThreadPool() {
executor = new ThreadPoolExecutor(
corePoolSize
, maximumPoolSize
, 60
, TimeUnit.SECONDS
, new SynchronousQueue<>(true) //公平策略,FIFO
, new BlockRejectedExecutionHandler()
);
}
public static <T> Future<T> submit(Callable<T> task) {
return executor.submit(task);
}
public static void submit(Runnable runnable) {
executor.submit(runnable);
}
private static class BlockRejectedExecutionHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
executor.getQueue().put(r);
} catch (InterruptedException ignored) {
}
}
}
}