`
yychao
  • 浏览: 98526 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

FutureTask实现分析

 
阅读更多

FutureTask实现一个可以取消的异步计算任务。

 

FutureTask的同步控制有内部类Sync负责;使用AQS的sync state表示运行状态。

 

FutureTask的状态:

  1. RUNNING =1: 表示任务正在运行
  2. RAN =2: 表示任务已经运行结束
  3. CANCELLED =4: 表示任务被取消
  4. 任务创建时,state = 0 

FutureTask的同步操作发生在:

  1. get()/get(timeout, TimeUnit) 等待任务执行结束;
  2. 同步控制采用共享模式:重写并支持AQS的 tryAcquireShare() /tryReleaseShare()
  3. 释放并唤醒等待线程:设置结果innerSet()/取消任务innerCancel()/设置任务异常innerSetException()

唤醒同步的时间点:任务执行结束innerRun()/任务取消innerCancel()/任务发生异常innerRun()或innerRunAndReset()调用innerSetException()方法

 

FutureTask中get()/get(timeout, TimeUnit)同步线程执行时,分别调用AQS方法:acquireSharedInterruptibly()/tryAcquireSharedNanos()

 

FutureTask中唤醒等待线程时,调用AQS方法:releaseShared()

 

FutureTask提供回调方法done() : 该方法在任务执行完成/任务取消/任务发生异常时回调;ExecutorCompletionService中任务QueueingFuture实现该方法,在任务完成时回调以将结果存入阻塞队列

 

 

FutureTask中任务多次执行方法:runAndReset() 执行任务但不设置任务执行结果,之后重置FutureTask为初始状态(state=0); 如果任务执行异常或者任务被取消,则任务无法再次执行; PS:此方法支持ScheduledFutureTask周期任务重复执行

 

 

 

分享到:
评论

相关推荐

    FutureTask底层实现分析,有了FutureTask主线程要想获得工作线程(异步计算线程)的结果变得比较简单

    FutureTask 底层实现分析 FutureTask 是 Java 中的一种非常重要的多线程设计模式,用于异步计算线程之间的结果传递。在 JDK 中,FutureTask 类是 Future 模式的实现,它实现了 Runnable 接口,作为单独的线程运行。...

    Java FutureTask类使用案例解析

    FutureTask类实现了RunnableFuture接口,RunnableFuture接口是Runnable和Future的综合体。 FutureTask类提供了一个runAndReset方法,该方法可以运行任务并重置Future的状态。 Callable和Runnable的转换可以使用...

    比较java中Future与FutureTask之间的关系

    FutureTask实现了RunnableFuture接口,而RunnableFuture则继承了Future与Runnable接口。因此,FutureTask不仅实现了Future接口的所有方法,还具有自己的run方法。 三、Future与FutureTask的关系 Future和...

    揭密FutureTask.docx

    在Java并发编程中,FutureTask扮演着至关重要的角色,它是实现异步计算的关键组件。本文将深入探讨FutureTask的原理和用法,帮助开发者更好地理解和利用这个强大的工具。 一、Future接口与FutureTask概述 Future...

    java面试精华14

    通过上述分析,我们可以看出,在Java中,使用`Callable`接口和`Future`或`FutureTask`可以轻松地实现异步执行任务并获取结果。这种方法非常适合那些需要等待长时间运行的任务完成并获取结果的场景。同时,通过使用...

    Java分布式应用学习笔记05多线程下的并发同步器

    本篇文章将深入探讨Java中的并发同步器,并通过具体的例子来解释如何使用`FutureTask`来实现线程之间的协作。 #### 2. FutureTask简介 `FutureTask`是Java并发编程中非常重要的一个类,它是`Future`接口的一个具体...

    性能极限漂移特技,只有头发少的人才知道.docx

    2. **手动实现FutureTask**:尝试自己动手实现一个简易版的`FutureTask`类,加深对其内部机制的理解。 3. **应用场景分析**:探讨`FutureTask`在实际项目中的具体应用场景,比如异步任务处理、定时任务调度等。 ###...

    并发编程、juc工具包源码分析笔记

    `FutureTask` 同时实现了 `Runnable` 和 `Future` 接口,`get()` 方法用于获取线程计算的结果。这个方法是同步的,调用者会被阻塞,直到计算完成或者抛出异常。此外,`get(long timeout, TimeUnit unit)` 方法允许...

    java8集合源码分析-Notes:笔记

    Future接口,常见的线程池中的FutureTask实现等 1.1.4 多线程 [Java 多线程:多线程生成的原因(Java内存模型与i++操作解析)] [Java 多线程:生产者消费者问题] [Java 多线程:synchronized 关键字(修饰类,方法,...

    Java使用Callable和Future创建线程操作示例

    Java使用Callable和Future创建线程操作示例主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项。 首先,Java 5开始,Java提供了...

    Java并发包源码分析(JDK1.8)

    AQS相关应用(CountDownLatch、CyclicBarrier、Semaphore等),executor(ThreadPoolExecutor、ScheduledThreadPoolExecutor、FutureTask等),collection(ConcurrentHashMap、CopyOnWriteArrayList等), ...

    java并发编程78讲.pdf

    本文将深入探讨为什么可以说本质上只有一种实现线程的方式,同时也会对比分析实现`Runnable`接口与继承`Thread`类这两种常见方法的区别。 #### 二、实现线程的两种基本方式 1. **实现Runnable接口** ```java ...

    corejava_面试题

    Java基础知识讲解与面试题分析: 1. Java源文件中是否可以...Java中可以通过继承Thread类、实现Runnable接口以及使用Callable接口和FutureTask类来实现多线程。同步可以通过synchronized关键字或者显式锁Lock类实现。

    Java多线程-JDK5.0新增线程创建方式

    `Future`接口提供了一种获取异步计算结果的机制,而`FutureTask`实现了`Runnable`接口和`Future`接口,既可作为线程执行的任务,又可获取任务的结果。 然而,使用`Callable`创建线程也存在一些缺点,最显著的一点是...

    商业编程-源码-一个用多线程实现文件查找的例子.zip

    比如在Java中,可以使用`Thread`类或`Runnable`接口来创建线程,或者使用`FutureTask`与`ExecutorService`配合进行异步操作。Python中则有`threading`模块,C++有`std::thread`库等。 此外,多线程编程需要注意线程...

    多线程、JVM复习&面试&强化训练100题

    4. 通过FutureTask包装器来创建线程:FutureTask可以与Callable配合使用,能够获取Callable执行的结果。 在选择使用Runnable还是Thread时,应当考虑到接口与类的区别,以及项目的设计需求。一般来说,推荐使用实现...

    JAVA并发编程实践JavaConcurrencyinPractice-中文-高清-带书签-完整版Doug Lea 等著

    - **Future与Executor框架**:深入理解FutureTask、Callable接口与ExecutorService框架的设计理念及其实现细节。 #### 3. Java内存模型 - **内存可见性问题**:探讨Java内存模型中的可见性问题及其解决策略。 - **...

    java多线程

    通过FutureTask或ExecutorService的submit()方法提交Callable任务,可以获取到线程执行的结果。 6. 守护线程: Thread类的setDaemon()方法可以设置线程为守护线程,守护线程不会阻止程序的退出,只有非守护线程...

Global site tag (gtag.js) - Google Analytics