自定义FutureTask的实现方法
发表于:2024-10-10 作者:千家信息网编辑
千家信息网最后更新 2024年10月10日,本篇内容主要讲解"自定义FutureTask的实现方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"自定义FutureTask的实现方法"吧!Future
千家信息网最后更新 2024年10月10日自定义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安全错误
数据库的锁怎样保障安全
上海晶添软件开发
数据库创建完成后不允许进行修改
青少年网络安全平台
软件开发笔记本标准电压
代理服务器 java
大兴区大型软件开发操作
5900x 服务器cpu
西电网络安全好考吗
中国十大网络安全产业
db2数据库还原
政府网络安全和信息化工作信息
金蝶k3数据库导出
tcp 代理服务器
敏捷软件开发工程师蛋糕
永恒修仙服务器大全
学校网络安全培训制度
天津超频服务器什么价格
网络安全小班ppt模板 免费
土地资源数据库地物面积
在哪里看苹果数据库
日本有网络安全这个行业吗
软件开发收入增值税免征
普陀区标准软件开发产品介绍
服务器路线图
公司使用服务器保存资料及加密
文档数据库缺乏统一的查询语言
公共数据库英文怎么说
心术铃声软件开发
网络安全需要学什么编程
江苏软件开发推荐