二、Callable
Callable和Future,一个产生结果,一个拿到结果。
Callable接口中只有一个call()方法,和Runnable相比,该方法有返回值并允许抛出异常。
方法 | 描述 |
---|---|
V call() | 计算结果,如果无法执行则抛出异常。 |
二、Future
Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在任务执行成功或失败后作出相应的操作。
方法 | 描述 |
---|---|
V get() | 阻塞直到计算完成,获得执行结果。 |
V get(long timeout, TimeUnit unit) | 阻塞给定时间,获取执行结果。 |
boolean cancel(boolean mayInterruptIfRunning) | 尝试取消执行此任务。 |
boolean isCancelled() | 判断此任务是否在正常完成之前被取消,如果是返回true。 |
boolean isDone() | 判断任务是否完成,如果是返回true。 |
三、FutureTask
FutureTask可以用做闭锁。(FutureTask实现了 Future语义,表示一种抽象的可生成结果的计算。)FutureTask表示的计算是通过Callable来实现的,相当于一种可生 成结果的Runnable,并且可以处于以下3种状态:等待运行(Waiting to nm),正在运行 (Running)和运行完成(Completed)。“执行完成”表示计算的所有可能结束方式,包括正 常结束、由于取消而结束和由于异常而结束等。当FutureTask进入完成状态后,它会永远 停止在这个状态上。
Future.get的行为取决于任务的状态。如果任务已经完成,那么get会立即返回结果,否则 get将阻塞直到任务进入完成状态,然后返回结果或者抛出异常。
FutureTask可以将计算结果从执行计算的线程传递到获取这个结果的线程,而FutureTask的规范确保了这种传递过程能实现结果的安全发布。
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> future = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws InterruptedException {
Thread.sleep(1000 * 10);
return "任务执行完成";
}
});
// 开始执行任务
future.run();
// 阻塞直到任务执行完成
String produnctInfo = future.get();
System.out.println("执行结果:" + produnctInfo);
}
四、示例:Callable 、 Future的使用
public static void main(String[] args) throws Exception {
ExecutorService executorService = Executors.newCachedThreadPool();
Future<Integer> future = executorService.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int i;
for (i = 0; i < 10000; i++) {
System.out.println(i);
}
return i;
}
});
System.out.println("计算结果:" + future.get());
System.out.println("End.");
}