手写FutureTask实现

在go中封装future对象处理异步结果 在go中,有了协程和chan,就能轻松而优雅的实现很多模式。 而引入future的思想可以解放思维。其它的不说了,看注释吧。 package utils import ( "sync" "time" ) /* Future 是一个未来的任务的抽象。和python里的那个有点类似。 在异步任务中SetResult,在GetResult的时候会等待result生成,或者超时。 ... 阅读详情

FutureTask

FutureTask是Future的实现,用来异步任务的获取结果,可以启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果。通过get()方法来获取异步任务的结果,但是会阻塞当前线程直至异步任务执行结束。一旦任务执行结束,任务不能重新启动或取消,除非调用runAndReset()方法

代码示例:

public class ThreadTest_Demo {
    static ExecutorService executors = Executors.newScheduledThreadPool(2);

    public ThreadTest_Demo() {
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callable<String> callable = new Callable<String>() {
            public String call() throws Exception {
                String str = "返回某个数据!";
                return str;
            }
        };
        Future<String> submit = executors.submit(callable);
        KaneFutureTask<String> futureTask = new KaneFutureTask(callable);
        (new Thread(futureTask)).start();
        System.out.println((String)futureTask.get());
    }
}

实现一个自己的FutureTask

根据FutureTask核心原理,要实现一个FutureTask必须满足以下方面:

  • 需要泛型定义用以返回结果类型
  • 需要一个callable对象,在构造方法中传入
  • 需要实现runnable接口,在run方法中实现具体结果计算
  • 需要一个公开的get方法来获取结果
  • 如果线程没有执行完,则调用get方法的线程需要进入等待队列
  • 需要一个字段记录线程执行的状态
  • 需要一个等待队列存储等待结果的线程

代码示例:

public class KaneFutureTask<T> implements Runnable {
    private Callable<T> callable;
    T result;//返回的结果
    volatile String state = "NEW";//线程执行的状态
    LinkedBlockingQueue<Thread> waiters = new LinkedBlockingQueue();//存储等待结果的线程

    public KaneFutureTask(Callable<T> callable) {
        this.callable = callable;
    }

	//run()方法未执行未必,阻塞
    public T get() {
        if ("END".equals(this.state)) {
            return this.result;
        } else {
            while(!"END".equals(this.state)) {//这里开始阻塞
            	//把线程存放到容器中
                this.waiters.offer(Thread.currentThread());
                //阻塞
                LockSupport.park();
            }

            return this.result;
        }
    }

    public void run() {
        try {
        	//执行Callable的call方法
            this.result = this.callable.call();
        } catch (Exception var5) {
            var5.printStackTrace();
        } finally {
        	//线程状态修改
            this.state = "END";
        }
        
		//从容器中取出当前线程
		Thread waiter = (Thread)this.waiters.poll();
        for(waiter != null) {
        	//取消阻塞
            LockSupport.unpark(waiter);
            waiter = (Thread)this.waiters.poll()
        }

    }
}

揭秘java线程池-高效利器背后的精髓(下)-进阶多线程-Callable、Future和手写线程池实战 监控和度量: 监控线程池的状态和性能指标,如活跃线程数、任务队列大小等。资源隔离: 对于不同类型的任务,考虑使用不同的线程池,以避免资源争抢。优雅关闭: 在应用程序关闭时,提供足够的时间让线程池中的线程优雅地关闭。持续优化: 根据应用程序的实际运行情况,持续调整线程池参数。通过遵循这些最佳实践,可以有效地提高线程池的性能,减少资源浪费,并确保应用程序的稳定性和可维护性。走过如此漫长的篇幅,我们已将关于Callable、Future和线程池实战的知识版图全景勾勒出来。 阅读详情

相关推荐

Java FutureTask本质解析:任务状态契约与假异步陷阱

FutureTask是Java并发中连接Callable、ExecutorService和Future的核心契约实现,其本质并非异步工具,而是一个具备状态机(NEW→COMPLETING→NORMAL/EXCEPTIONAL)的可执行任务容器。它通过AtomicInteger管理生命周期,用WaitNode链表+LockSupport.park实现get()阻塞,但所有阻塞行为均取决于state字段而非线程调度。正因如此,未配合超时的get()极易引发线程池耗尽,而isDone()仅表示任务终结(含失败/取

weixin_33910460的博客 400

LockSupport的park()和unpark()的简单使用

concurrent包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS框架借助于两个类: Unsafe(提供CAS操作) LockSupport(提供park/unpark操作) 因此,LockSupport非常重要。 两个重点 (1)操作对象 归根结底,LockSupport.park()和LockSupport.unpark(Thread thread)调用的是Unsafe中的native代码: //LockSupport中 public static

及时雨的csdn 1712

大疆sdkV4以及V5webrtc推流

webrtcSDK中要用它的VideoCapturer来初始化推流 ViewdoCapturer是一个接口我们继承它 然后重建创建文件CapturerAircraft.java文件。CameraUtil.java这个是我们用来创建CapturerAircraft的一个工具。除了CapturerAircraft这个文件不一样外其他都是一样的。PlayBodyBean.java这个是我们的配置文件。下面的有个代码块第一个是v4的 第二个是v5的。接着我们来创建几个推流用到的webrtc工具。

weixin_41624865的博客 1188

FutureTask详解

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

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

2024从零开始使用VSCode编程(静态页面制作篇)HTML+CSS+JS阶段

VSCode第一个前端静态页面的编写

ssrsrrn的博客 9590

WPF+MVVM案例实战(二十三)- 阴影效果详解

通过附加属性实现阴影效果,通过改变不同的阴影属性值达到不同阴影效果

lingshuangcanxue 559

FutureTask的使用方法及实现原理

FutureTask用法介绍 FutureTask是JDK并发包为Future接口提供的一个实现,代表一个支持取消操作(cancel)的异步计算任务。它实现了Future接口和Runnable接口,所以既是计算任务对象也是结果对象。它可以提交到线程池中去执行,并且结果直接放在自身这个FutureTask中,不是放在另外一个Future中。我们把FutureTask提交到线程池运行的方法一般是先实...

zhuguang10的博客 2786

基于LSTM算法实现交通流量预测(Pytorch版)

本研究采用PyTorch框架,设计并实现了一种基于LSTM(Long Short-Term Memory)网络的交通流量预测模型。针对时序性显著的交通流量数据,模型首先将多节点、多通道的时空信息整合为一维特征输入至多层LSTM单元,利用其捕捉长期依赖及短期波动的能力进行深度学习。全连接层随后调整时间步长以适应预测周期需求。模型结构灵活,能适应不同节点数、输入输出长度及通道配置,实现在给定历史流量数据基础上对未来交通流量的精准预测,为交通管理与规划提供数据驱动支持。

打酱油的葫芦娃 4637

FutureTask 详解

FutureTask 除了实现 Future 接口外,还实现了 Runnable 接口。因此,FutureTask 可以交给 Executor 执行,也可以由调用线程直接执行(FutureTask.run())。根据 FutureTask.run()方法被执行的时机,FutureTask 可以处于下面 3 种状态。1) 未启动: 当创建一个 FutureTask,且没有执行 FutureTask.run()方法之前,这个 FutureTask 处于未启动状态。

weixin_52383177的博客 1944

【AFAC2026金融智能-赛题二】2亿像素的面条图,我切了1000刀拼回完美Markdown

摘要: AFAC2026金融智能创新大赛的「复杂金融文档还原挑战」任务是将高分辨率金融文档截图转换为结构化Markdown文本。面对2亿像素的“面条图”和严格的计算限制(禁用主流大模型,仅允许调用FinixDoc-VL API且模型需小于10M),作者提出四层流水线解决方案: 图像预处理:通过文本行投影检测在行间隙处智能切图,避免截断文字; API调度:5路并发轮询请求,结合内容哈希缓存与指数退避重试机制优化调用效率; 后处理:采用最长公共子串匹配去除文本重叠,并设计表格对齐算法修复跨块表格; 结果输出:按

169

Flask基础项目:从零到一搭建用户管理系统

本文介绍了一个基于Flask的用户管理系统,具有完整的增删改查功能。系统采用SQLAlchemy ORM进行数据库操作,自动处理SQL注入并首次运行时创建表结构。主要特点包括:实时统计用户总数和平均年龄、智能即时搜索、前后端双重数据验证、邮箱唯一性检查、流畅动画效果和响应式设计。后端使用Flask框架实现RESTful API,前端采用现代化UI设计,支持异步操作不阻塞界面。系统安装简单,只需创建数据库并安装依赖即可运行,适合作为基础用户管理系统的参考实现。

数据知道的博客 3837

Callable、FutureTask及手写实现

创建线程的两种方式:Thread和Runnable,但它们都有一个缺点:无法获取返回值。 如果需要进行异步运算,而且需要获取运算的结果值,可以使用Callable和FutureTask。 FutureTask API boolean isCancelled() 是否取消。 boolean isDone() 是否计算结束。 boolean cancel(boolean mayInterr...

程序员小潘 3343

SAP_FICO模块-资产减值功能对折旧和残值的影响

SAP_FICO模块-资产减值操作对资产历史折旧以及后续折旧的影响,包括减值操作的配置前提

风沙的博客 2804

实现多线程间通信的FutureTask,我们来手写一个

Callable实现线程通信 我们先来温习下如何让创建多线程: “ 1.继承Thread 2.实现Runnable 3.调用Callable 4.使用线程池ThreadPoolExecutor ” 我们在平时的开发中肯定遇到过【B线程如何获取A线程中的数据】,经验老道的程序员首先会想到使用Callable实现。直接看代码: 如上图,线程A【Thread-0】里面存入了字符串【Lvshen的技术小屋】。我们要在主线程【main】获取这个值,就采用如上方法。测试结果如下: 10:51:12

wujialv的博客 347

斑鬣狗优化算法(SHO)详解:从生物原理到代码实战

斑鬣狗优化算法(SHO)是一种新型元启发式优化算法,灵感来源于斑鬣狗的群体狩猎行为。该算法通过模拟斑鬣狗的包围猎物、协同狩猎和攻击猎物等生物行为,将优化问题转化为智能搜索过程。SHO算法包含探索与开发两个阶段,通过数学模型实现群体协作和自适应平衡,具有参数简单、收敛快等优势。文章系统介绍了SHO的生物基础、数学模型、实现方法(包括MATLAB和Python代码)、改进策略以及在函数优化、路径规划等领域的应用案例,最后讨论了算法的优势、局限性和未来研究方向。

qq_42212808的博客 237

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

手写Callable、FutureTask实现主线程阻塞,获取异步线程的执行结果

手写Callable、FutureTask实现主线程阻塞,获取异步线程的执行结果

jack__love的博客 816

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

手写一个Callable和FutureTask,异步线程执行并得到结果,了解其原理

/ 1. 创建callable@Override// 模拟执行耗时 3秒try {return new User("用户" + new Date().getTime(), "29");// 2.创建futureTask// 3.放到线程中执行// 4.获取返回结果// 5.打印最后,这里是用wait和notify模拟的,还可以使用LockSupport来实现。

刻苦的樊同学 628

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JAVA手写FutureTask,带你了解FutrueTask的基本原理,附代码。

JAVA手写FutureTask,带你了解FutrueTask的基本原理。

liuhongya328的博客 502

并发编程第12篇,FutureTask原理

FutureTask原理 使用FutureTask可以返回当前线程的结果。 可以让线程阻塞或者是唤醒 LockSupport与Wait/notify FutureTask简单用法 public class Test001 implements Callable<String> { public static void main(String[] args) throws ExecutionException, InterruptedException { ...

xchnba2107的博客 278

手写Callable

手写Callable 了解其运行原理 下面代码是我手写的一个实现callable的实现类。不谈具体实现了什么类容,重点是怎么让这个线程跑起来的。用了submit()方法。 看看源码里面到底是个什么鬼。 看一下submit()方法的源码 我去RunnableFuture 这玩意又是个什么鬼? newTaskFor() 又是个啥玩意?来再往下看 答案:原来RunnableFuture就是个Runn...

weixin_40323340的博客 236

自己写一个FutureTask类,如何?

多线程的应用场景: 第二种方式明显更好。 两种不同的写法: 1、单线程: 2、多线程: 可以改写成: 效果: 手写一个FutureTask类代替JDK的 上代码: import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.locks.LockSupport; /** * @author Edward * @version 1.0 * @date 2020/11/24 21:48 * 目标

Forever Young 275

Java Future模式详解:异步编程核心原理+实战代码+JDK内置实现

摘要:本文深入解析Java Future模式,通过对比传统同步流程和Future异步流程,展示如何利用"异步执行+结果延迟获取"提升系统吞吐量。核心内容包括:1) Future模式概念及类比场景;2) 手写实现关键组件(FutureData、RealData、Client);3) JDK内置Future优化方案。文章通过流程图、代码示例和角色说明,完整呈现Future模式的设计思想与实战应用,帮助开发者掌握多线程编程中的高效异步处理技巧。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1512

FutureTask原理回顾与手写FutureTask

平时大家使用FutureTask主要有以下4个步骤: 1.先创建一个Callable子类,在call方法写线程需要执行的代码 2.new FutureTask()在构造函数中传递Callable子类 3.将该FutureTask交给线程运行 4.调用get()方法阻塞等待,一直等到获取到结果为止。 public class Test implements Callable<String>{ public static void main(String[] args) throws Execu

weixin_41464742的博客 193

手写FutureTask

首先继承 Runnable Future 接口然后实现 我们只需要 用到run() 和get()方法就可以其它不用看 this.wait(); 调用这个方法让它阻塞,一致等到结果 然后调用notifyAll() 唤醒线程. import java.util.concurrent.*; public class JxdFutureTask<V> implements Runn...

weixin_39831786的博客 351

FutureTask原理和手写

简单用法 实现 Callable 接口,核心是get()方法会调用 LockSupport的park和unpark方法,让线程阻塞,直到拿到响应的结果 package com.mayikt; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * @Description: * @Author:

ctycsdn的博客 181

万字教程带你拆解并手写 Java FutureTask ,全程图示详解,保证保姆级!

无锁 FutureTask,最核心的思想是 get 方法中的循环,为什么要在入队后还做一步判断再 park,以及对于链表 CAS 入队和虚假唤醒的处理。 其次的一些点就是,通过 state 来维护任务的各种执行状态,并在 future.get 的最后有一个 report(state),根据任务状态来包装返回值或者抛出对应的异常。

wyx1473343124的博客 1058
上一篇: CurrentHashMap源码详解
下一篇: Java并发编程之java.util.concurrent包——CountDownLatch篇
_Romeo
_Romeo 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Romeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值