/**
* Runnable接口有个问题,它的方法没有返回值。如果任务需要一个返回结果,那么只能保存到变量,还要提供额外的方法读取,非常不便。
* Java标准库还提供了一个Callable接口,和Runnable接口比,它多了一个返回值
* Callable接口是一个泛型接口,可以返回指定类型的结果
* 当我们提交一个Callable任务后,我们会同时获得一个Future对象,然后,我们在主线程某个时刻调用Future对象的get()方法,就可以获得异步执行的结果。
* 在调用get()时,如果异步任务已经完成,我们就直接获得结果。如果异步任务还没有完成,那么get()会阻塞,直到任务完成后才返回结果。
* ***************************************************
* 一个Future<V>接口表示一个未来可能会返回的结果,它定义的方法有:
* get():获取结果(可能会等待)
* get(long timeout, TimeUnit unit):获取结果,但只等待指定的时间;
* cancel(boolean mayInterruptIfRunning):取消当前任务;
* isDone():判断任务是否已完成。
*/
class TestFuture{
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(4);
//定义任务
Callable<String> task = new Callable<String>() {
@Override
public String call() throws Exception {
return "callable接口";
}
};
// 提交任务并获得Future:
Future<String> future = executor.submit(task);
try {
// 从Future获取异步执行返回的结果:
String result = future.get();//可能阻塞
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}