源码分析--FutureTask(二)

SAP ABAP实战:用GN_DELIVERY_CREATE批量创建内部交货单的完整代码与避坑指南 本文详细介绍了在SAP ABAP开发中使用GN_DELIVERY_CREATE函数批量创建内部交货单的完整实现方案。通过数据结构设计、多源数据整合、批量处理逻辑和错误处理机制等核心环节的深入解析,帮助开发者高效完成物流单据自动化处理,特别针对VL31N/VL32N等常见场景提供避坑指南。 阅读详情

常用方法

set & setException:
更新状态值,唤醒栈中等待的线程

protected void set(V v) {
    // CAS 将 state 修改为 COMPLETING,该状态是一个中间状态
    if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {
        outcome = v; // 输出结果赋值
        // 将 state 更新为 NORMAL
        UNSAFE.putOrderedInt(this, stateOffset, NORMAL); // final state
        finishCompletion();
    }
}

protected void setException(Throwable t) {
    // CAS 将 state 修改为 COMPLETING,该状态是一个中间状态    
    if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {
        outcome = t; // 输出结果赋值
        // 将 state 更新为 EXCEPTIONAL        
        UNSAFE.putOrderedInt(this, stateOffset, EXCEPTIONAL); // final state
        finishCompletion();
    }
}

这两个方法的操作类似,都是更新 state 的值并给返回结果 outcome 赋值,然后执行结束操作 finishCompletion 方法:

private void finishCompletion() {
    // assert state > COMPLETING;
    for (WaitNode q; (q = waiters) != null;) {
        // 将 waiters 置空
        if (UNSAFE.compareAndSwapObject(this, waitersOffset, q, null)) {
            for (;;) {
                Thread t = q.thread;
                if (t != null) {
                    q.thread = null;
                    // 唤醒 WaitNode 封装的线程
                    LockSupport.unpark(t);
                }
                WaitNode next = q.next;
                if (next == null)
                    break;
                q.next = null; // unlink to help gc
                q = next;
            }
            break;
        }
    }

    done();

    callable = null;        // to reduce footprint
}

finishCompletion 方法的作用就是唤醒栈中所有等待的线程,并清空栈。其中的 done 方法实现为空:

protected void done() { }

子类可以重写该方法实现回调功能。

awaitDone:
等待任务执行完成

// Awaits completion or aborts on interrupt or timeout.
private int awaitDone(boolean timed, long nanos)
    throws InterruptedException {
    final long deadline = timed ? System.nanoTime() + nanos : 0L;
    WaitNode q = null;
    boolean queued = false;
    for (;;) {
        // 响应线程中断
        if (Thread.interrupted()) {
            removeWaiter(q);
            throw new InterruptedException();
        }

        int s = state;
        // s > COMPLETING 表示任务已执行完成(包括正常执行、异常等状态)
        // 则返回对应的状态值
        if (s > COMPLETING) {
            if (q != null)
                q.thread = null;
            return s;
        }
        // s == COMPLETING 是一个中间状态,表示任务尚未完成
        // 这里让出 CPU 时间片
        else if (s == COMPLETING) // cannot time out yet
            Thread.yield();
        // 执行到这里,表示 s == NEW,将当前线程封装为一个 WaitNode 节点
        else if (q == null)
            q = new WaitNode();
        // 这里表示 q 并未入栈,CAS 方式将当 WaitNode 入栈
        else if (!queued)
            queued = UNSAFE.compareAndSwapObject(this, waitersOffset,
                                                 q.next = waiters, q);
        // 有超时的情况
        else if (timed) {
            nanos = deadline - System.nanoTime();
            if (nanos <= 0L) {
                removeWaiter(q);
                return state;
            }
            LockSupport.parkNanos(this, nanos);
        }
        // 将当前线程挂起
        else
            LockSupport.park(this);
    }
}

该方法的主要判断步骤如下:

这里是引用
若线程被中断,则响应中断;
若任务已完成,则返回状态值;
若任务正在执行,则让出 CPU 时间片;
若任务未执行,则将当前线程封装为 WaitNode 节点;
若 WaitNode 未入栈,则执行入栈;
若已入栈,则将线程挂起。
以上步骤是循环执行的,其实该方法的主要作用就是:当任务执行完成时,返回状态值;否则将当前线程挂起。

report:
封装返回结果

private V report(int s) throws ExecutionException {
    Object x = outcome; // 输出结果赋值
    // 正常结束
    if (s == NORMAL)
        return (V)x;
    // 取消
    if (s >= CANCELLED)
        throw new CancellationException();
    // 执行异常
    throw new ExecutionException((Throwable)x);
}

cancel:
取消任务

public boolean cancel(boolean mayInterruptIfRunning) {
    if (!(state == NEW &&
          UNSAFE.compareAndSwapInt(this, stateOffset, NEW,
              mayInterruptIfRunning ? INTERRUPTING : CANCELLED)))
        return false;
    try {    // in case call to interrupt throws exception
        if (mayInterruptIfRunning) {
            try {
                // 若允许中断,则尝试中断线程
                Thread t = runner;
                if (t != null)
                    t.interrupt();
            } finally { // final state
                UNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED);
            }
        }
    } finally {
        finishCompletion();
    }
    return true;
}
vivado安装空间与依赖要求:入门须知要点 准备安装Vivado时,需重点关注系统空间和依赖环境的配置。结合vivado安装教程,详细说明最低磁盘要求、内存配置及操作系统兼容性,帮助新手快速搭建开发环境,避免常见安装失败问题。 阅读详情

相关推荐

【VisionMaster】图像源模块之本地图像

图像采集之图像源

zhy29563 6956

08 多线程与高并发 - FutureTask 源码解析

08 多线程与高并发 - FutureTask 源码解析

刘元雄 508

代码审计工具学习之Seay(安装以及初步认识)

目录 1.1名词解释 1.2代码审计的重要性 1.3代码审计的步骤 1.4代码审计的内容 1.5常见的代码审计工具 2 Seay 2.1什么是Seay 2.2Seay的安装过程 3典型漏洞分析 3.1什么是命令注入漏洞 3.2 如何理解命令注入漏洞 3.3 如何防御命令注入漏洞 4 利用工具对命令注入漏洞进行分析 4.1DVWA靶场命令注入漏洞分析 4.2 Pikachu靶场命令注入漏洞分析 1.1名词解释 软件代码审计是对编程项目中源代码的全面...

weixin_52515588的博客 2万+

重拾线程——FutureTask 是如何吃掉异常(2)

前言 首先,我们先写个示例代码来运行 FutureTask: val futureTask = FutureTask { println("futureTask 正在执行") throw Exception("我是测试异常") println("futureTask 发生异常了!") return@FutureTask "1" } Thread(futureTask).start() 运行结果: futureTask

不近视的猫的博客 2705

Agent Harness Engineering: AI Agent 执行管控与安全沙箱 原理与最佳实践

我们正站在计算范式转移的历史节点上。2024-2026 年间,AI 系统从被动的内容生成器(Generative AI)演变为主动的行动执行者(Agentic AI)。这一转变的根本特征是:根据 2026 年初的行业数据:然而,能力的提升伴随着风险的指数级增长。2024-2026 年间发生的多起标志性安全事件揭示了 Agent 系统的脆弱性:案例 1:Slack AI 数据外泄事件(2024 年 8 月)案例 2:制造业供应链攻击(2026 年 Q3)案例 3:Arup 深度诈骗案(2026 年 9 月)这

AI天才研究院 1667

【项目实战】TARA威胁分析和风险评估

TARA是信息安全领域中的一种风险评估方法,在汽车信息安全的上下文中,TARA分析特别重要,因为它可以帮助识别和管理与智能网联车辆相关的各种威胁,包括数据泄露、未经授权的访问、远程操控等。通过TARA分析,企业可以制定出针对性的安全目标、产品要求和产品安全声明,以确保汽车及其零部件符合相关的信息安全标准和法规。此外,TARA分析还可以与数字化建模系统结合,以更系统化和高效的方式进行风险评估和管理。

奶爸的编程之路,也就一周冷个三天 2709

FutureTask源码解析二

本篇主要介绍FutureTask源码 我们知道FutureTask实现了RunnableFuture接口,即Runnable接口和Future接口,Runable可以对应FutureTask的task,表示FutureTask本质上也是一个task任务,而Future对应FutureTask中的Future,表示了我们对于这个task任务可以执行某些操作,如判断任务是否执行完毕,获取任务的执行结果...

大佬请赐教 552

YOLOv8优化:特征融合 | 金字塔稀疏 Transformer(PST)——一个轻量级、即插即用的模块 | 25年7月最新成果

将 PST 嵌入当前最先进的实时检测模型(YOLOv11-N/S/M)后,在 MS COCO 上的 mAP 分别提升 0.9%、0.5%、0.4%,而延迟增加极小。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 610

FutureTask(异步执行的任务)源码解析

FutureTask源码解析

s.lm的博客 600

基于Python的MOOC课程评价爬取与分析系统设计与实现

本文详细介绍了如何使用Python最新技术栈构建一个高效的MOOC课程评价爬取与分析系统。系统采用Scrapy框架结合Selenium实现动态页面抓取,利用PyMySQL进行数据存储,并通过Pandas和Matplotlib实现数据可视化分析。文章从爬虫原理、技术选型、系统设计到代码实现进行全面讲解,为教育工作者改进教学质量提供数据支持。关键词:Python爬虫、MOOC评价分析、Scrapy框架、数据可视化、教学改进。

2201_76125261的博客 1103

上线之前多一道闸:业务审核系统的接入定义、双轨状态机与可靠生效闭环

运营后台“保存即生效”,让价格、库存、人群等配置每次修改都相当于一次无评审的上线。本文以至尊会员降价活动为例,系统拆解业务审核系统:用带业务语义的操作编码、规则化审核人与候选人快照、完整的生效回调契约做好接入定义;把业务改造为提交待生效,以不可变快照、字段级差异和唯一约束加幂等号防误配防重复;用审批轨与执行轨双轨状态机、链路式重新提交和以事件为准的审核链路理清状态;最后以发件箱、幂等键、超时先查后试、乐观锁与对账闭合生效环节,并结合两个可运行的Java程序,给出五种生效策略的事故率实测对比。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 6万+

FutureTask介绍及使用

Future Future是一个接口,它定义了5个方法: boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException;简单说明一下接口定义 boolean cancel(boolean mayInterruptInRunning) 取消一个任务,并返回取消结果。参数表示是

ywb201314的专栏 1035

海洋CMS admin_notify.php 远程代码执行漏洞复现(CVE-2024-30565)

海洋CMS admin_notify.php 接口处存在远程代码执行漏洞,经过身份验证的远程攻击者可利用该漏洞执行任意代码,写入后门文件,进而控制整个web服务器。

0xSec 2713

JUC源码分析-线程池篇(二):FutureTask

Future 表示了一个任务的生命周期,是一个可取消的异步运算,可以把它看作是一个异步操作的结果的占位符,它将在未来的某个时刻完成,并提供对其结果的访问。在并发包中许多异步任务类都继承自Future,其中最典型的就是 FutureTask,本章我们将通过对 FutureTask 的源码解析来看一下异步任务的实现方式。 概述 FutureTask 为 Future 提供了基础实现,如获取任...

yongchao940的专栏 273

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

● 任务从NEW状态变成INTERRUPTING,然后再转换为INTERRUPTED。只要任务结束了,无论是正常返回,异常返回,还是任务被取消都会执行这个方法。而这个方法其实就是唤醒那些执行get方法等待任务结果的线程。这个是线程获取FutureTask任务执行结果的方法。任务执行完毕后,修改任务的状态以及封装任务的结果。● 任务直接从NEW状态转换为CANCEL。

qq_45309297的博客 429

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

FutureTask源码分析

FutureTask源码分析

sodawoods的博客 1311

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【并发编程】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

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 源码分析

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

u011385940的专栏 2536

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
上一篇: 源码分析--FutureTask(一)
下一篇: Java线程知识学习
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值