本文共 2259 字,大约阅读时间需要 7 分钟。
public static void useCompletableFuture_complicated() { ExecutorService executor = Executors.newFixedThreadPool(2); List personNameList = new ArrayList<>(); for (int i = 0; i < 1000; i++) { personNameList.add(String.valueOf(i)); } for (String personName : personNameList) { CompletableFuture.supplyAsync(new Supplier () { @Override public String get() { System.out.println(personName + ": Hello World!"); return "task finished!"; } }, executor).exceptionally(e -> { System.out.println("异常处理:" + e.getMessage()); return "error"; }); } executor.shutdown(); while (!executor.isTerminated()) { System.out.println("线程池未终止"); try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { System.out.println("主线程被打断:" + e.getMessage()); e.printStackTrace(); } }} public static void useCompletableFuture_simple() { ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 1L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), new OwlThreadFactory("ThreadPool")); List nameList = new ArrayList<>(); for (int i = 0; i < 1000; i++) { nameList.add(String.valueOf(i)); } nameList.forEach(name -> CompletableFuture.supplyAsync(() -> { System.out.println(Thread.currentThread().getName() + ", name=" + name); return "success"; }, executor).exceptionally(e -> { System.out.println("异常处理:" + e.getMessage()); return "error"; })); // 由于ThreadPoolExecutor是公用线程池,不能直接关闭,需谨慎管理} From OwlThreadFactory's [特征名称]-Worker-[线程ID]线程池安全使用:
shutdown()关闭线程池时,不会打断已提交的任务。isTerminated()检查线程池状态,需在shutdown()后等待所有任务完成。默认线程池风险:
Executors.newFixedThreadPool()默认使用无界队列,可能导致内存泄漏。异步操作特点:
CompletableFuture.supplyAsync()适用于非阻塞任务,适合处理大量耗时操作。两种实现方式在功能上一致,简洁型代码更依赖JDK特性,复杂型代码提供更低层次的操作控制。选择哪种方式取决于具体需求,建议根据项目规模选择合适的线程池策略,并注意线程池的安全管理。
转载地址:http://gmefk.baihongyu.com/