在ThreadPoolExecutor中提供了4种线程的策略可以供开发者直接使用:
•AbortPolicy策略:默认策略,如果线程池队列满了丢掉这个任务并且抛出RejectedExecutionException异常。
•DiscardPolicy策略:如果线程池队列满了,会直接丢掉这个任务并且不会有任何异常。
•DiscardOldestPolicy策略:如果队列满了,会将最早进入队列的任务删掉腾出空间,再尝试加入队列。
•CallerRunsPolicy策略:如果添加到线程池失败,那么主线程会自己去执行该任务,不会等待线程池中的线程去执行。
如果你要自定义一个拒绝策略,那么可以这样写:
executor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// 拒绝策略的逻辑
}
});
jdk8 线程池
ExecutorService fixedThreadPool = null;
try {
// 多线程
// 线程池 设置线程池名称
ThreadFactory namedThreadFactory =
new ThreadFactoryBuilder()
.setNameFormat("thread-Pool-%d")
.build();
fixedThreadPool =
new ThreadPoolExecutor(
20,// 核心线程数
50,// 最大线程数
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(500),// 设置队列大小
namedThreadFactory,
new ThreadPoolExecutor.CallerRunsPolicy());// 设置现场池队列满了之后的策略
// 提交一批任务
ExecutorService finalFixedThreadPool = fixedThreadPool;
List<CompletableFuture<JSONObject>> futures =
我的队列.stream()
.map(
s ->
CompletableFuture.supplyAsync(
() -> {
//处理逻辑
return new JSONObject();
},
finalFixedThreadPool))
.collect(Collectors.toList());
// 将这一批CompletableFuture对象,使用allOf操作得到一个CompletableFuture对象
CompletableFuture<Void> allFutures =
CompletableFuture.allOf(futures.toArray(new CompletableFuture[] {}));
// allFutures(即所有futures)执行完毕后。执行thenApply()内部的逻辑,实现转化。因为此处依旧是交由子线程处理的,所以返回的依旧是CompletableFuture<List<JSONObject>>对象
CompletableFuture<List<JSONObject>> listCompletableFuture =
allFutures.thenApply(
s -> futures.stream().map(r -> r.join()).collect(Collectors.toList()));
log.info("多线程验执行完毕");
List<JSONObject> threadResultList = listCompletableFuture.get();
if (!CollectionUtils.isEmpty(threadResultList)) {
resultArray.addAll(threadResultList);
}
} catch (Exception e) {
log.error("多线程验执行异常,异常信息为:" + e.getMessage(), e);
} finally {
if (null != fixedThreadPool) {
fixedThreadPool.shutdown();
}
}