import java.util.concurrent.*; public class CustomThreadPoolExample { public static void main(String[] args) { // 创建自定义线程池 ExecutorService customExecutor = Executors.newFixedThreadPool(5); // 使用自定义线程池 CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> { System.out.println("任务1 - 线程: " + Thread.currentThread().getName()); return "结果1"; }, customExecutor); CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> { System.out.println("任务2 - 线程: " + Thread.currentThread().getName()); return "结果2"; }, customExecutor); // 关闭线程池 customExecutor.shutdown(); } }核心使用场景
1 异步计算与结果获取
// 场景:耗时计算,主线程继续执行其他任务 public class AsyncCalculator { public static void main(String[] args) throws Exception { // 1. 创建计算任务 FutureTask<Integer> futureTask = new FutureTask<>(() -> { System.out.println("开始复杂计算..."); Thread.sleep(2000); return 1 + 2 + 3 + 4 + 5; }); // 2. 提交到线程执行 new Thread(futureTask).start(); // 3. 主线程继续执行其他任务 System.out.println("主线程继续处理其他业务..."); Thread.sleep(1000); // 4. 需要结果时获取(阻塞等待) Integer result = futureTask.get(); System.out.println("计算结果: " + result); } }2 任务超时控制
// 场景:避免无限等待,设置超时时间 public class TimeoutTask { public static void main(String[] args) { FutureTask<String> task = new FutureTask<>(() -> { Thread.sleep(5000); // 模拟耗时操作 return "Result"; }); new Thread(task).start(); try { // 设置3秒超时 String result = task.get(3, TimeUnit.SECONDS); System.out.println("成功获取: " + result); } catch (TimeoutException e) { System.out.println("任务超时,取消任务"); task.cancel(true); // 中断执行线程 } catch (Exception e) { e.printStackTrace(); } } }3 任务取消与中断
// 场景:用户取消长时间运行的任务 public class CancellableTask { public static void main(String[] args) throws InterruptedException { FutureTask<Integer> task = new FutureTask<>(() -> { for (int i = 0; i < 10; i++) { System.out.println("处理第 " + i + " 个任务"); Thread.sleep(1000); } return 100; }); Thread worker = new Thread(task); worker.start(); // 3秒后取消任务 Thread.sleep(3000); System.out.println("用户取消任务"); boolean cancelled = task.cancel(true); // true表示中断线程 System.out.println("取消结果: " + cancelled); System.out.println("是否已取消: " + task.isCancelled()); } }4 任务依赖关系
// 场景:任务B依赖任务A的结果 public class DependentTasks { public static void main(String[] args) throws Exception { // 任务A:获取用户信息 FutureTask<String> taskA = new FutureTask<>(() -> { Thread.sleep(1000); return "User-123"; }); // 任务B:依赖任务A的结果 FutureTask<String> taskB = new FutureTask<>(() -> { String userId = taskA.get(); // 等待任务A完成 Thread.sleep(500); return "Profile for " + userId; }); // 并行执行 ExecutorService executor = Executors.newFixedThreadPool(2); executor.submit(taskA); executor.submit(taskB); // 获取最终结果 String result = taskB.get(); System.out.println(result); // Profile for User-123 executor.shutdown(); } }5 批量任务并行执行
// 场景:并行执行多个独立任务,等待所有完成 public class BatchTasks { public static void main(String[] args) throws Exception { List<FutureTask<Integer>> tasks = new ArrayList<>(); // 创建10个并行任务 for (int i = 0; i < 10; i++) { final int taskId = i; FutureTask<Integer> task = new FutureTask<>(() -> { Thread.sleep((long) (Math.random() * 1000)); return taskId * 10; }); tasks.add(task); new Thread(task).start(); } // 收集所有结果 int total = 0; for (FutureTask<Integer> task : tasks) { total += task.get(); // 按完成顺序获取结果 } System.out.println("总计: " + total); } }总结
FutureTask的核心价值 :
- 任务封装 :将Callable/Runnable封装为可管理的任务单元
- 结果获取 :提供阻塞/非阻塞的结果获取方式
- 生命周期管理 :完善的状态机管理任务生命周期
参考资料:Java多线程与并发编程-FutureTask 的使用场景