系列导航
获取线程的返回结果
一、使用介绍
我们在执行线程后,如果需要获取执行的结果,则需要用到Callable和Future来获得。常用的有Callable+Future和Callable+FutureTask。
二、示例
PS:shutdown()方法执行后,会立刻停止添加任务,但是已经在执行的任务会处理完成;而shutdownNow()方法将会尝试停止所有任务,并返回未执行的任务。
1、Future
Future接口有一个泛型参数,在实际运行时,通过future.get()方法来获取线程的真正运行结果。
public class CallableFuture {
public static void main(String[] args) {
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
Future<Integer> result = cachedThreadPool.submit(new Task1());
cachedThreadPool.shutdown();
try {
//get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回
System.out.println("-------------task1返回结果 : " + result.get());
} catch (Exception e) {
System.out.println("-------------接收结果失败-------------");
e.printStackTrace();
}
System.out.println("-------------task执行完成");
}
}
class Task1 implements Callable<Integer> {
public Integer call() throws Exception {
System.out.println("----------子线程调度 : " + Thread.currentThread().getId());
Thread.sleep(2000);
return (int) (Math.random() * 100);
}
}
2、FutureTask
FutureTask是一种可以取消的(在线程执行完成之前取消)异步线程,它实现了Runnable接口和Future接口,也就是说,它可以自行运行,也可以交给线程池管理。
public class CallableFutureTask {
public static void main(String[] args) {
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
FutureTask<Integer> futureTask = new FutureTask<Integer>(new Task2());
//自行运行得到结果
// futureTask.run();
//交给线程池管理运行
cachedThreadPool.submit(futureTask);
cachedThreadPool.shutdown();
try {
//get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回
System.out.println("-------------task1返回结果 : " + futureTask.get());
} catch (Exception e) {
System.out.println("-------------接收结果失败-------------");
e.printStackTrace();
}
System.out.println("-------------task执行完成");
}
}
class Task2 implements Callable<Integer> {
public Integer call() throws Exception {
System.out.println("----------子线程调度 : " + Thread.currentThread().getId());
Thread.sleep(2000);
return (int) (Math.random() * 100);
}
}