代码改变世界

jdk8 线程池策略

  方斌  阅读(168)  评论(0编辑  收藏  举报

在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();
   }
 }

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示