自定义FutureTask的实现方法
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,本篇内容主要讲解"自定义FutureTask的实现方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"自定义FutureTask的实现方法"吧!Future
千家信息网最后更新 2025年01月23日自定义FutureTask的实现方法
本篇内容主要讲解"自定义FutureTask的实现方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"自定义FutureTask的实现方法"吧!
FutureTask
FutureTask是Future的实现,用来异步任务的获取结果,可以启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果。通过get()方法来获取异步任务的结果,但是会阻塞当前线程直至异步任务执行结束。一旦任务执行结束,任务不能重新启动或取消,除非调用runAndReset()方法。
代码示例:
public class ThreadTest { public static void main(String[] args) throws Exception { CallablemyCallable = 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安全错误
数据库的锁怎样保障安全
4g终端服务器
江西网络技术服务信息中心
网络安全法从何时开始实行
网络安全大赛ctf成员
中国台湾超频服务器大概费用
red5服务器管理
澡堂管理系统数据库
创造与魔法刚开服务器什么样子
不懂软件开发如何做销售
陕西服务器公司有哪些虚拟主机
linux追加数据库
东莞通讯软件开发优化价格
计算机网络及其网络技术
云顶之巅服务器开到什么时候
智慧档案网络安全
镇江国内软件开发公司排行
固态硬盘 做服务器
裕华区高科技软件开发服务供应
网络安全通讯监测系统
中国农林数据库指的是什么
julia 语言数据库
泄露 数据库 下载
合肥翔润网络技术有限公司
网络安全法第二十三条规矩
联想服务器硬盘检测不到
dell服务器温度获取
六查六防 网络安全
如何读取数据库文件
青岛崂山区软件开发公司
win10u8连接不上数据库