自定义FutureTask的实现方法
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容主要讲解"自定义FutureTask的实现方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"自定义FutureTask的实现方法"吧!Future
千家信息网最后更新 2025年12月02日自定义FutureTask的实现方法
本篇内容主要讲解"自定义FutureTask的实现方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"自定义FutureTask的实现方法"吧!
FutureTask
FutureTask是Future的实现,用来异步任务的获取结果,可以启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果。通过get()方法来获取异步任务的结果,但是会阻塞当前线程直至异步任务执行结束。一旦任务执行结束,任务不能重新启动或取消,除非调用runAndReset()方法。
代码示例:
public class ThreadTest { public static void main(String[] args) throws Exception { Callable myCallable = new MyCallableThread(); FutureTask futureTask = new FutureTask<>(myCallable); Thread myCallableThread = new Thread(futureTask); myCallableThread.setName("MyThread-implements-Callable-test"); myCallableThread.start(); System.out.println("Run by Thread:" + futureTask.get()); //通过线程池执行 ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit(futureTask); executorService.shutdown(); System.out.println("Run by ExecutorService:" + futureTask.get()); }}class MyCallableThread implements Callable { @Override public String call() throws Exception { return Thread.currentThread().getName(); }} 实现一个自己的FutureTask
根据FutureTask核心原理,要实现一个FutureTask必须满足以下方面:
需要泛型定义用以返回结果类型
需要一个callable对象,在构造方法中传入
需要实现runnable接口,在run方法中实现具体结果计算
需要一个公开的get方法来获取结果
如果线程没有执行完,则调用get方法的线程需要进入等待队列
需要一个字段记录线程执行的状态
需要一个等待队列存储等待结果的线程
代码示例:
/** * 1. 泛型定义 * 2. 构造方法 callable * 3. 实现了runnable * 4. get方法返回callable执行结果 * 5. get方法有阻塞的效果(未执行结束的话) */public class MyFutureTaskimplements Runnable { // 程序执行的结果 private T result; // 要执行的任务 private Callable callable; // 任务运行的状态 private volatile int state = NEW; // 任务运行的状态值 private static final int NEW = 0; private static final int RUNNING = 1; private static final int FINISHED = 2; // 获取结果的线程等待队列 LinkedBlockingQueue waiters = new LinkedBlockingQueue<>(100); // 执行当前FutureTask的线程,用CAS进行争抢 AtomicReference runner = new AtomicReference<>(); public MyFutureTask(Callable task) { this.callable = task; } @Override public void run() { // 判断当前对象的状态,如果是New且抢锁成功就执行 if (state != NEW || !runner.compareAndSet(null, Thread.currentThread())) return; state = RUNNING; try { result = callable.call(); } catch (Exception e) { e.printStackTrace(); } finally { state = FINISHED; } // 方法执行完,唤醒所有线程 while (true) { Thread waiterThread = waiters.poll(); if (waiterThread == null) break; LockSupport.unpark(waiterThread); } } public T get() { // 如果状态不是FINISHED,则进入等待队列 if (state != FINISHED) { waiters.offer(Thread.currentThread()); } while (state != FINISHED) { LockSupport.park(); } return result; }}// MyFutureTask 测试public class FutureTaskTest { public static void main(String[] args) { Callable myCallable = new MyCallableThread(); MyFutureTask futureTask = new MyFutureTask<>(myCallable); Thread myCallableThread = new Thread(futureTask); myCallableThread.setName("MyFutureTask-test"); myCallableThread.start(); System.out.println("Run by Thread:" + futureTask.get()); }}class MyCallableThread implements Callable { @Override public String call() throws Exception { return Thread.currentThread().getName(); }}
到此,相信大家对"自定义FutureTask的实现方法"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
方法
任务
结果
线程
状态
队列
代码
内容
对象
示例
学习
查询
运行
阻塞
实用
更深
成功
兴趣
原理
字段
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全是关系国家主权
ps3安全模式重建数据库
数据库 0 1 显示
临沂app定制软件开发解决方案
云南久大网络技术有限公司怎么样
论文资料数据库有哪些
GOGO搜索软件开发
致敬网络安全的幕后英雄
服务器串口在biso怎么看
最新软件开发招聘
学it软件开发培训哪家好
广西展望互联网科技有限公司
怎么查看数据库文件在哪里
大数据网络技术基础课程
必火网络安全学院地址
没有加密的网络安全吗
数据库物理文件包括哪两部分
剑网3服务器
中国网络技术是自给自足吗
win7服务器vpn
数据库 不是的查询语法
山东医院数显钟服务器
错误信息服务器响应不安全
网络安全手抄报字少一些
多功能软件开发厂家报价
通达信高级行情服务器地址更新
代理服务器 购买
数据库技术带来的弊端
it软件开发项目管理工作坊
sas病例数据库