源码分析--FutureTask(一)

告别手动复制粘贴!用R语言脚本批量抓取TCMSP中药靶点基因(附完整代码) 本文介绍如何使用R语言脚本自动化抓取TCMSP数据库中的中药靶点基因数据,告别手动复制粘贴的低效操作。通过详细的代码示例和参数设置,帮助研究人员快速获取并过滤符合药代动力学标准的中药成分及其靶点基因,大幅提升研究效率。特别适合生物信息学和中药现代化研究领域的从业者。 阅读详情

概述

FutureTask 是一个可取消的、异步执行任务的类,它实现了 RunnableFuture 接口,而该接口又继承了 Runnable 接口和 Future 接口,因此 FutureTask 也具有这两个接口所定义的特征。

在这里插入图片描述
RunnableFuture 接口

public interface RunnableFuture<V> extends Runnable, Future<V> {
    /**
     * Sets this Future to the result of its computation
     * unless it has been cancelled.
     */
    void run();
}

Future 接口

/*
 * 尝试取消执行任务。若任务已完成、已取消,或者由于其他某些原因无法取消,则尝试失败。
 * 若成功,且调用该方法时任务未启动,则此任务不会再运行;
 * 若任务已启动,则根据参数 mayInterruptIfRunning 决定是否中断该任务。
 */
boolean cancel(boolean mayInterruptIfRunning);

// 若该任务正常结束之前被取消,则返回 true
boolean isCancelled();

/*
 * 若该任务已完成,则返回 true
 * 这里的“完成”,可能是由于正常终止、异常,或者取消,这些情况都返回 true
 */
boolean isDone();

// 等待计算完成(如果需要),然后获取结果
V get() throws InterruptedException, ExecutionException;

// 如果需要,最多等待计算完成的给定时间,然后检索其结果(如果可用)
// PS: 该方法与前者的区别在于加了超时等待
V get(long timeout, TimeUnit unit)
    throws InterruptedException, ExecutionException, TimeoutException;

源码分析

构造方法

// 创建一个 FutureTask 对象,在运行时将执行给定的 Callable
public FutureTask(Callable<V> callable) {
    if (callable == null)
        throw new NullPointerException();
    this.callable = callable;
    this.state = NEW;       // ensure visibility of callable
}

// 创建一个 FutureTask,在运行时执行给定的 Runnable,
// 并安排 get 将在成功完成时返回给定的结果
public FutureTask(Runnable runnable, V result) {
    this.callable = Executors.callable(runnable, result);
    this.state = NEW;       // ensure visibility of callable
}

这两个构造器分别传入 Callable 对象和 Runnable 对象(适配为 Callable 对象),然后将其状态初始化为 NEW。

成员变量

//与任务相关变量
private volatile int state;
private static final int NEW          = 0;
private static final int COMPLETING   = 1;
private static final int NORMAL       = 2;
private static final int EXCEPTIONAL  = 3;
private static final int CANCELLED    = 4;
private static final int INTERRUPTING = 5;
private static final int INTERRUPTED  = 6;


//其他变量
/** The underlying callable; nulled out after running */
// 提交的任务
private Callable<V> callable;

/** The result to return or exception to throw from get() */
// get() 方法返回的结果(或者异常)
private Object outcome; // non-volatile, protected by state reads/writes

/** The thread running the callable; CASed during run() */
// 执行任务的线程
private volatile Thread runner;

/** Treiber stack of waiting threads */
// 等待线程的 Treiber 栈
private volatile WaitNode waiters;

其中 state 表示任务的状态,总共有 7 种,它们之间的状态转换可能有以下 4 种情况:

任务执行正常:NEW -> COMPLETING -> NORMAL
任务执行异常:NEW -> COMPLETING -> EXCEPTIONAL
任务取消:NEW -> CANCELLED
任务中断:NEW -> INTERRUPTING -> INTERRUPTED

内部类
对 Thread 的封装

static final class WaitNode {
    volatile Thread thread;
    volatile WaitNode next;
    WaitNode() { thread = Thread.currentThread(); }
}

常用方法
1.任务执行 run()方法

public void run() {
    // 使用 CAS 进行并发控制,防止任务被执行多次
    if (state != NEW ||
        !UNSAFE.compareAndSwapObject(this, runnerOffset,
                                     null, Thread.currentThread()))
        return;
    try {
        Callable<V> c = callable;
        if (c != null && state == NEW) {
            V result;
            boolean ran;
            try {
                // 调用 Callable 的 call 方法执行任务
                result = c.call();
                ran = true;
            } catch (Throwable ex) {
                // 异常处理
                result = null;
                ran = false;
                setException(ex);
            }
            // 正常处理
            if (ran)
                set(result);
        }
    } finally {
        // runner must be non-null until state is settled to
        // prevent concurrent calls to run()
        runner = null;
        // state must be re-read after nulling runner to prevent
        // leaked interrupts
        int s = state;
        // 线程被中断
        if (s >= INTERRUPTING)
            handlePossibleCancellationInterrupt(s);
    }
}

2.获取执行结果get()方法

// 获取执行结果(阻塞式)
public V get() throws InterruptedException, ExecutionException {
    int s = state;
    // 若任务未执行完,则等待它执行完成
    if (s <= COMPLETING)
        // 任务未完成
        s = awaitDone(false, 0L);
    // 封装返回结果
    return report(s);
}

// 获取执行结果(有超时等待)
public V get(long timeout, TimeUnit unit)
    throws InterruptedException, ExecutionException, TimeoutException {
    if (unit == null)
        throw new NullPointerException();
    int s = state;
    if (s <= COMPLETING &&
        (s = awaitDone(true, unit.toNanos(timeout))) <= COMPLETING)
        throw new TimeoutException();
    return report(s);
}

这两个方法都是获取任务执行的结果,原理也基本一样,区别在于后者有超时等待(超时会抛出 TimeoutException 异常)。

其他方法后续学习补充~

【Python计量】linearmodels面板数据回归(一) 我们以伍德里奇《计量经济学导论现代方法》的”第14章高级面板数据方法“的案例14.1为例,使用jtrain中的数据来进行固定效应估计。 阅读详情

相关推荐

嵌入式设备系统日志记录及调试技巧_嵌入式日志系统(1),如何成为杰出的程序员

这里面我使用的芯片为哈弗体系,全局常量存储编译器默认分配在flash,需要注意如果使用片内flash时,注意存储调试等级的flash块不要与代码区重合,要不然修改调试等级擦除flash块同时PC指针指向当前块的代码区,会导致仪器死机;这个也是之前用的比较多的,以上代码是模仿linux 内核的写法,可以比较好的做到日志信息分层,编译时相加对应的编译开关即可。但有个弊端就是,切换debug等级时,需要重新编译且需更新固件,而嵌入式设备出现异常后更新固件往往复位后,故障有时很难复现,调试起来比较浪费时间。

2401_84240431的博客 1292

FutureTask.get(timeOut)执行原理浅析

使用java多线程解决问题的时候,为了提高效率,我们常常会异步处理一些计算任务并在最后异步的获取计算结果,这个过程的实现离不开Future接口及其实现类FutureTask。FutureTask类实现了Runnable, Future接口,接下来我会通过源码对该类的实现进行详解。 我们先看下FutureTask中的主要方法如下,可以看出FutureTask实现了任务及异步结果的集合功能。看到这块的方法,大家肯定会有疑问,Runnable任务的run方法返回空,FutureTask如何依靠该方法获取线程异步

搓搓那年时光静好 8631

Visual MODFLOW Flex 6.1新手入门:从数据导入到3D建模的完整工作流解析

本文为Visual MODFLOW Flex 6.1新手提供了从零开始构建地下水数值模型的完整工作流指南。详细解析了从项目规划、数据准备与导入,到构建三维概念模型、生成并运行数值模型,直至结果可视化与校准的核心步骤。帮助水文地质与环工领域初学者快速掌握这一专业软件,高效完成从数据到三维建模的全过程。

a1b2c的博客 800

Java线程池submit阻塞获取结果实现原理

Java线程池中提交任务运行,通常使用execute()方法就足够了。那如果想要实现在主线程中阻塞获取线程池任务运行的结果,该怎么办呢?答案是用submit()方法提交任务。这也是面试中经常被问到的一个知识点,execute()和submit()提交任务的的区别是什么?底层是如何实现的?submit()方法中调用方法获取对象。// 调用FutureTask的构造方法返回RunnableFuture对象}复制代码FutureTaskFutureTask是一个异步计算任务,包装了我们外部提交的任务。

BASK2311的博客 2589

IBIS模型中的Pullup和Pulldown曲线详解:如何避免信号完整性设计中的常见错误

本文深入解析IBIS模型中Pullup和Pulldown曲线的关键作用,揭示其在信号完整性设计中的黄金法则。通过详细分析曲线特性、常见误区及验证方法,帮助工程师避免设计错误,优化高速PCB设计。文章还展示了曲线数据在动态终端匹配、串扰预测和电源完整性分析中的高级应用,提升设计效率和可靠性。

weixin_30275415的博客 450

RISC-V IP中的ITCM/DTCM与Slave-AHB接口设计解析

本文深入解析RISC-V IP中ITCM/DTCM与Slave-AHB接口的设计要点,涵盖TCM架构原理、总线协议实现及性能优化策略。通过实际案例展示如何实现单周期访问延迟,解决跨时钟域同步等关键问题,为嵌入式系统提供确定性内存访问方案。特别探讨了AHB总线仲裁机制和RTL实现技巧,助力开发者构建高效可靠的RISC-V处理器子系统。

weixin_28419039的博客 529

FutureTask介绍

java.util.concurrent.FutureTask&lt;V&gt;   介绍: FutureTask实现了RunnableFuture接口,具备了Runnable和Future的所有特性。    Future提供了一种获得异步线程运行结果的机制。可以通过调用get方法得到结果,如果线程还未结束,会阻塞当前线程直至结果返回或中断发生。Future一般和Callable以及Ex...

Do re Mi fa So la xi 170

R语言分段回归

1.利用虚拟变量进行线性回归 (MEdata.csv的数据来源:https://github.com/ChenQihome9/优快云-Data-Library/blob/master/MEdata.csv) 问题13:针对TAX~GDP,使用分段回归方法,找到其回归方程。编程,并根据程序结果叙述如下几方面问题:(1)分几段最佳?(不超过5段内)(2)分段位置定在哪儿最佳?(3)写出最佳方...

ChenQihome9的博客 1万+

FutureTask详解

FutureTask介绍 一个可取消的异步计算。FutureTask提供了对Future的基本实现,可以调用方法去开始和取消一个计算,可以查询计算是否完成并且获取计算结果。只有当计算完成时才能获取到计算结果,一旦计算完成,计算将不能被重启或者被取消,除非调用runAndReset方法。 除了实现了Future接口以外,FutureTask还实现了Runnable FutureTask使用 Futu......

做一个有思想的技术人 9万+

生信入门第七课:使用FastQC软件进行测序原始fastq数据质控

从实验到数据:RNA定量、文库片段长度、fastqc质控和fastp去接头

微生信 486

RK3588 开启多窗口

这样就支持多窗口了。

tzj1058756809的博客 267

RunnableFuture接口(源码解读)

此接口继承了Runnable和Future接口。 其中Runnable接口中就只有一个run方法,用于执行任务。 其中Future接口中主要有: 对任务的执行进行取消操作。 判断任务是否被取消。 判断任务是否被执行完成。 获取任务返回的结果。 至此RunnableFuture接口想要其实现类实现的功能就是相当于一个拥有run方法的future接口。 可以执行任务。 可以取消...

Anakki的博客 1315

pdb文件删除杂原子 HETATM;保留或去除水分子

这样操作水分子也会跟着删除,如果需要保留水分子。

weixin_42357472的博客 2644

**FutureTask应用&源码分析**(一)

FutureTask是一个可以取消异步任务的类。FutureTask对Future做的一个基本实现。可以调用方法区开始和取消一个任务。一般是配合Callable去使用。异步任务启动之后,可以获取一个绑定当前异步任务的FutureTask。可以基于FutureTask的方法去取消任务,查看任务是否结果,以及获取任务的返回结果。FutureTask内部的整体结构中,实现了RunnableFuture的接口,这个接口又继承了Runnable, Future这个两个接口。

qq_45309297的博客 471

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

面试题集锦-线程池-线程池里面有个线程异常了,这个线程会怎么样?

先上答案: 1⃣️如果是execute方法提交任务,则抛出异常,如果是submit提交任务,如果调用了get()获取FutureTask的返回结果,则会抛出异常,如果没有调用get()方法则不会抛异常. 2⃣️异常的线程会从线程池中移除 以下是测试代码: package com.memory.studydemo.threadpool; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; imp..

u012294039的专栏 838

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

FutureTask源码分析

FutureTask源码分析

sodawoods的博客 1311

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【并发编程】FutureTask 源码分析

先看一段FutureTask获取线程返回值简单应用的代码,以下基于jdk8进行源码分析。 package com.lanhuigu.demo.createthread; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurren...

yhl_jxy的博客 2017

FutureTask和CompleteableFuture源码分析

同步:做了同步操作后,被调用者不会主动通知我结果,我需要主动查看结果。异步:做了异步操作后,被调用者会主动通知我结果是什么。阻塞:调用功能后,不能做其他事情。非阻塞:调用功能后,可以做其他事情。

qq_74092815的博客 741

【源码分析】FutureTask超详细的源码分析

【源码分析】FutureTask超详细的源码分析

qq_57102164的博客 1541

FutureTask应用&源码分析

FutureTask是一个可以取消异步任务的类。FutureTask对Future做的一个基本实现。可以调用方法区开始和取消一个任务。一般是配合Callable去使用。异步任务启动之后,可以获取一个绑定当前异步任务的FutureTask。可以基于FutureTask的方法去取消任务,查看任务是否结果,以及获取任务的返回结果。FutureTask内部的整体结构中,实现了RunnableFuture的接口,这个接口又继承了Runnable, Future这个两个接口。

javaeEEse的博客 556

java futuretask 源码解析_Java异步编程——深入源码分析FutureTask

Java的异步编程是一项非常常用的多线程技术。之前通过源码详细分析了ThreadPoolExecutor《你真的懂ThreadPoolExecutor线程池技术吗?看了源码你会有全新的认识》。通过创建一个ThreadPoolExecutor,往里面丢任务就可以实现多线程异步执行了。但之前的任务主要倾向于线程池,并没有讲到异步编程方面的内容。本文将通过介绍Executor+Future框架(Futu...

weixin_29378975的博客 143

FutureTask 源码分析

JDK源码学习 深入分析下 java.util.concurrent 包下 FutureTask 类 简单画了个UML图,可以看到FutureTask, CompletableFuture 都有实现 Future接口类 FutureTask类 先来看Future的实现类 --> FutureTask间接实现Runnable,Future, 可作为一个任务被执行,也能获取计算结果 有些场景需要异步执行任务, 或子线程并行执行任务,此时就可用FutureTask来实现,可以阻塞获取返回值.

u011385940的专栏 2536

JDK源码分析 FutureTask源码分析

文章目录前言一、Callable接口二、Future接口三、FutureTask源码分析3.1 Future继承结构图3.2 参数介绍3.3 构造函数3.4. FutureTask的API源码分析3.4.1. run():3.4.2 get()3.4.3. cancel 前言 一般我们创建线程的方式主要有两种,一种是直接继承Thread类,一种是实现Runnable接口。但是这两种方法是有缺陷的,...

_ostreamBaba 489

FutureTask源码解析

目录1. 前言2. FutureTask继承体系3. 源码分析3.1 成员变量3.2 构造方法3.3. 成员方法3.3.1 run()方法及与其相关的方法3.3.2 get()方法及与其相关的方法3.3.3 cancel(boolean mayInterruptIfRunning)方法4. 总结 1. 前言 在创建线程的方式中,我们可以直接继承Thread和实现Callable接口来创建线程,但是这两种创建线程的方式不能返回执行的结果。于是从JDK1.5开始提供了Callable接口和Future接口,这两

qq_50313418的博客 1674

FutureTask使用及源码分析

最近工作中,遇到一个需求:300ms内请求到服务器返回值,否则取消请求。完成这个需求的时候,使用到了FutureTask。在这里就记录一下,并且研究一下其实现的原理。 文章顺序: FutureTask的使用。 开发中可能出现的问题。 结合FutureTask的源码分析问题。 精华部分 1. FutureTask的使用 在Java中,一般是通过继承Thread类或者实现Runnable接...

pengmutian的专栏 359
上一篇: 源码分析--ReentrantReadWriteLock(二)
下一篇: 源码分析--FutureTask(二)
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值