面试题答案
一键面试默认线程池
在Java的CompletableFuture中,默认情况下,如果没有指定线程池,会使用ForkJoinPool.commonPool() 作为线程池来执行异步任务。ForkJoinPool是Java 7引入的一种特殊线程池,它使用工作窃取算法来提高多线程应用的性能。commonPool() 是一个静态方法,返回一个公共的ForkJoinPool实例,该实例被多个CompletableFuture共享使用。这个公共线程池的线程数量默认是 Runtime.getRuntime().availableProcessors() - 1
,但最少为1。
自定义线程池执行异步任务
- 创建线程池:首先需要创建一个自定义的线程池,例如使用ThreadPoolExecutor来创建。
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; ExecutorService executor = Executors.newFixedThreadPool(10); // 或者使用更灵活的ThreadPoolExecutor构造函数 ThreadPoolExecutor customExecutor = new ThreadPoolExecutor( 5, // 核心线程数 10, // 最大线程数 10L, TimeUnit.SECONDS, // 线程存活时间 new java.util.concurrent.LinkedBlockingQueue<>() // 任务队列 );
- 使用自定义线程池执行CompletableFuture任务:
CompletableFuture.supplyAsync(() -> { // 异步任务代码 return "Result"; }, executor);
这里的 supplyAsync
方法接收两个参数,第一个是异步执行的任务(Supplier类型),第二个就是自定义的线程池。这样就可以使用自定义线程池来执行CompletableFuture的异步任务了。当任务执行完毕后,建议关闭线程池以释放资源。
java executor.shutdown(); try { if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { executor.shutdownNow(); if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { System.err.println("Pool did not terminate"); } } } catch (InterruptedException ie) { executor.shutdownNow(); Thread.currentThread().interrupt(); }