线程池: 如何解决线程池中的线程被堵住的问题?
如果线程池被堵住, 将没有可用线程来执行新提交任务, 新提交任务将被存到任务队列等待执行。
例如, 在一个线程中并发请求多个其他外部接口,
一个折中的方案
既用到了当前线程, 又用到了线程池, 给当前线程加上了翅膀/辅助。
、
// coreSize 16 任务队列最长64, 当超出64, 创建新的线程,非核心线程最长存活60s, 决绝策略设置为 用main线程执行被拒绝的任务
// 降低了系统资源分配和避免OOM异常,并行调用外部多个接口, 降低了调用时间
ThreadPoolExecutor executor =
new ThreadPoolExecutor(16, 32, 60,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(64), new ThreadPoolExecutor.CallerRunsPolicy());
LinkedList<Future<String>> futures = new LinkedList<>();
for (int i = 0; i < 300; i++) {
int finalI = i;
Future<String> future = executor.submit(() -> {
Thread.sleep(200);
return Thread.currentThread().getName();
});
futures.add(future);
}
futures.forEach(f -> {
try {
if ("main".equalsIgnoreCase(f.get())) {
System.out.println(f.get());
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
});
executor.shutdown();