线程池可以通过 Future
或回调函数来跟踪任务的完成情况。Future
是执行异步任务的结果的代表,它允许你在任务完成后获取结果或异常,也可以用来判断任务是否已经完成。
下面是一个使用 ExecutorService
和 Future
来追踪任务执行完成的代码示例:
使用 ExecutorService
和 Future
示例
import java.util.concurrent.*;
public class ThreadPoolExample {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(3);
// 提交任务并返回Future对象
Future<Integer> future = executorService.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
// 模拟任务执行
System.out.println("Task started.");
Thread.sleep(2000); // 模拟任务执行时间
System.out.println("Task completed.");
return 42; // 任务返回结果
}
});
// 等待任务执行完成并获取结果
Integer result = future.get(); // 如果任务完成,get() 会返回结果,否则阻塞直到完成
System.out.println("Task result: " + result);
// 关闭线程池
executorService.shutdown();
}
}
解释
- 使用
Executors.newFixedThreadPool(3)
创建一个固定大小为 3 的线程池。 - 使用
submit()
提交一个任务,任务类型为Callable<Integer>
,它会返回一个Integer
类型的结果。 future.get()
会阻塞当前线程,直到任务完成并返回结果。这个方法还可以用来获取任务执行过程中抛出的异常。- 完成后,打印任务的执行结果。
通过 Future
对象,线程池可以管理任务的执行状态,并在任务完成后返回结果或异常。