Future 是一个接口 表示异步计算的结果。它提供了检查计算是否完成的方法 和 等待计算的完成,并获取计算的结果的方法。
Future的主要方法
isDone(); 查询任务是否完成
下面的例子中submit执行了一个Callable类型的任务然后得到了Futuer类型的结果result。
// 新建一个Callable任务 CallablecallableTask = new Callable () { @Override public Integer call() throws Exception { System.out.println("--->开始执行任务 计算1+1"); TimeUnit.SECONDS.sleep(2);// 休眠2秒 return 2; } }; ExecutorService executor = Executors.newCachedThreadPool(); Future result = executor.submit(callableTask); executor.shutdown(); while (!result.isDone()) {// isDone()方法可以查询子线程是否做完 System.out.println("子线程正在执行"); TimeUnit.SECONDS.sleep(1);// 休眠1秒 } try { System.out.println("子线程执行结果:" + result.get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); }
结果
FutureTask类是 Future 接口的一个实现
FutureTask类实现了RunableFuture接口 ,RunnableFuture又继承了Runnable接口和Future接口
FutureTask 可以作为Runnable被线程执行
也可以Future得到传入Callable对象的结果
FutureTaskfutureTask = new FutureTask<>(new Callable () { @Override public Integer call() throws Exception { System.out.println("futureTask 开始执行计算 1+1"); return 2; } }); Thread t1 = new Thread(futureTask);// 1.可以作为Runnable类型对象使用 t1.start(); try { System.out.println(futureTask.get());// 2.可以作为Future类型对象得到线程运算返回值 } catch (ExecutionException e) { e.printStackTrace();
}
结果
可以看出FutureTask可以当作一个有返回值的Runnable任务来用。
分析:FutureTask
相当于把Callable任务转换为Runnable任务,就可以使用线程来执行该任务。而futureTask.get()
相当于将Callable转化为Future,从而得到异步运算的结果。
ExecutorService执行器除了接收Runnable与Callable类型的入参,也可以接收FutureTask类型,
FutureTaskfutureTask = new FutureTask<>(new Callable () { @Override public Integer call() throws Exception { System.out.println("futureTask 计算 1+1"); TimeUnit.SECONDS.sleep(2); return 2; } }); ExecutorService executor = Executors.newCachedThreadPool(); executor.submit(futureTask);// 也可以使用execute,证明其是一个Runnable类型对象 executor.shutdown(); while (!futureTask.isDone()) { System.out.println("子线程还没做完,我再睡会"); TimeUnit.SECONDS.sleep(1); } try { System.out.println("子线程运行的结果:" + futureTask.get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); }
结果
转自:https://www.cnblogs.com/zhrb/p/6372799.html