FutureTask为可取消的异步计算任务的程序处理。这个异步任务是可以取消的,
。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。
可使用 FutureTask 包装 Callable 或 Runnable 对象。因为 FutureTask 实现了 Runnable,所以可将 FutureTask 提交给 Executor 执行。
除了作为一个独立的类外,此类还提供了 protected 功能,这在创建自定义任务类时可能很有用。
这个JDK官方手册的解释,至于FutureTask提供哪些方法请自行查看API.
下面根据本人的理解勇哥简单的程序来诠释FutureTask的意思,程序的设计思想为:当一辆公交车到站之后司机需要停车等待所有乘客上车之后才能继续开车行驶,这里我们把司机开车认为为主线程,乘客上车为其他线程,只有所有乘客上车完毕司机才能开车。我们可以把乘客上车当做是一个异步计算任务,异步任务一执行完毕,主线程启动并且这个异步任务状态不再改变。
程序如下:
乘客这个异步任务:
package com.test.futuretask; import java.util.concurrent.Callable; public class PassengerCallable implements Callable{ //总共有10个等待上公交的乘客 private int passengerCounts = 10; //所有乘客上公交花费的所有时间 private int totalTime = 0; @Override public Integer call() throws Exception { while(passengerCounts > 0) { passengerCounts--; totalTime++; //每个乘客上车花费1秒 Thread.sleep(1 * 1000); } return totalTime; } }
司机主线程:
package com.test.futuretask; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class BusDriverMainThread { public static void main(String args[]) { Callable callable = new PassengerCallable(); FutureTask futureTask = new FutureTask(callable); Thread thread = new Thread(futureTask); thread.start(); while (!futureTask.isDone()) { System.out.println("还有乘客没有上车,司机继续等待...."); } int countTime = 0; try { countTime = futureTask.get(); } catch (InterruptedException e) { // TODO e.printStackTrace(); } catch (ExecutionException e) { // TODO e.printStackTrace(); } finally { System.out.println("所有乘客都已全部上车,司机请开车,总共花费" + countTime + "秒"); } } }
相关推荐
Java 多线程与并发(17_26)-JUC线程池_ FutureTask详解
LiteGo可以直接投入Runnable、Callable、FutureTask 等类型的实现来运行一个任务,它的核心组件是「SmartExecutor」,它可以用来作为「App」内支持异步并发的唯一组件。 在一个App中「SmartExecutor」可以有多个...
实践学习:Java异步编程(Future、FutureTask、Guava.ListenableFuture、Java8.CompletableFuture等) 在实践中学习:使用 RxJava/Reactor 进行 Java 响应式编程。 一次技术讲座,介绍学习和实践。
JAVA线程总结,包含线程池,显示使用线程实现异步编程,基于JDK中的Future实现异步编程,JDK中的FutureTask等
future源码Java中具有CompletableFuture的异步编程 介绍 CompletableFuture API是用于Java异步编程的高级API。 该API支持将多个异步计算流水线化(也称为链接或合并)成单个结果,而不会造成嵌套回调(“ callback ...
FutureTask是可取消的异步的计算任务,它可以通过线程池和线程对象执行,一般来说是FutureTask用于耗时的计算。 二,FutureTask继承图 三,未来任务源码 FutureTask的七种状态 状态(state) 值 描述 新的 0 任务...
主要介绍了Java线程池FutureTask实现原理详解,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
使用FutureTask实现超时执行的代码如附件:FutureTaskAndExcutor.java 不直接构造Future对象,也可以使用ExecutorService.submit方法来获得Future对象,submit方法即支持以 Callable接口类型,也支持Runnable接口...
主要为大家详细介绍了Java中Future、FutureTask原理以及与线程池的搭配使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在本篇文章里我们给大家分享了java中Future与FutureTask之间的关系的内容,有需要的朋友们可以跟着学习下。
主要介绍了Java中的Runnable,Callable,Future,FutureTask的比较的相关资料,需要的朋友可以参考下
主要介绍了futuretask用法及使用场景介绍,小编觉得挺不错的,这里分享给大家,供大家参考。
FutureTask底层实现分析,有了FutureTask主线程要想获得工作线程(异步计算线程)的结果变得比较简单
主要介绍了简谈java并发FutureTask的实现,FutureTask都是用于获取线程执行的返回结果。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
java.util.concurrent.FutureTask ; /** * @Author IamZY * @create 2019/12/28 14:57 */ public class CallableDemo { public static void main ( String [] args ) throws ExecutionException , ...
6.1.1 串行地执行任务 6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 6.2.2 执行策略 6.2.3 线程池 6.2.4 Executor的生命周期 6.2.5 延迟...
Spring中的同步执行器 1. SyncTaskExecutor:同步可以用SyncTaskExecutor,但这个可以说不算一个线程池,因为还在原线程执行。这个类没有实现异步调用...前者是同步执行器,执行任务同步,后者是线程池,执行任务异步。
主要介绍了Java FutureTask类使用案例解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值析,需要的朋友可以参考下
(1)用作异步任务使用,且可以使用get方法获取任务的结果 (2)用于表示一些时间较长的计算 状态 等待运行 正在运行 运行完成 使用Callable对象实例化FutureTask类 ...
Java Concurrency Patterns and Features Concurrency Patterns and features found in Java, through multithreaded programming. Features: Threads and Runnables Locks Intrinsic Explicit Reentrant Read...