Callable
和Future
是Java并发包中用于支持并发编程的两个接口。它们通常与ExecutorService
(线程池)一起使用,用于执行具有返回值的任务,并在任务执行完成后获取结果或取消任务。
Callable 接口:
Callable
是一个接口,类似于Runnable
接口,但是它有返回值,并且可以抛出异常。Callable
定义了一个带有泛型的call
方法,该方法返回一个结果并可能抛出异常。
import java.util.concurrent.Callable;
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
// 执行一些耗时的任务,返回结果
return 42;
}
}
Future 接口:
Future
接口用于表示异步计算的结果,它提供了一些方法来检查计算是否完成、等待计算完成并获取结果,以及取消计算等。
import java.util.concurrent.*;
public class FutureExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<Integer> callable = new MyCallable();
Future<Integer> future = executor.submit(callable);
try {
// 阻塞等待任务执行完成,并获取结果
Integer result = future.get();
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
executor.shutdown();
}
}
在上面的示例中,Future
通过get
方法等待任务执行完成,并获取返回结果。如果任务还未完成,get
方法会阻塞当前线程,直到任务完成为止。
组合使用:
Callable
和Future
通常一起使用,通过submit
方法提交Callable
任务给ExecutorService
,然后通过返回的Future
对象来管理任务的执行和获取结果。
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<Integer> callable = new MyCallable();
Future<Integer> future = executor.submit(callable);
try {
// 阻塞等待任务执行完成,并获取结果
Integer result = future.get();
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
executor.shutdown();
总的来说,Callable
和Future
提供了一种更灵活的方式来处理并发任务的执行和获取结果,尤其适用于需要在任务执行完成后获取结果的情况。