Future,RunnableFuture,FutureTask学习

Future接口

public interface Future<V> {//取消任务执行 //当任务还没有启动,返回ture//当任务正在运行中,会根据mayInterruptIfRunning参数决定是否中断当前运行的线程来取消当前运行的任务//当任务已经完成或异常,其他一些原因不能中断时,返回falseboolean cancel(boolean mayInterruptIfRunning);//判断任务完成之前是否被取消//只用当任务时未启动状态或完成之前被取消 该方法才会返回true,其他情况都返回falseboolean isCancelled();//判断任务是否执行完成//异常退回,正常执行完成,被取消 都会返回trueboolean isDone();//获取任务执行结果会异常//会阻塞等到结果返回V get() throws InterruptedException, ExecutionException;//同上 只不过设置了超时时间,超时之后会返回出TimeoutException异常V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;
}

RunnableFuture

public interface RunnableFuture<V> extends Runnable, Future<V> {//任务void run();
}

FutureTask

public class FutureTask<V> implements RunnableFuture<V> {/**线程可能变化的路线* NEW -> COMPLETING -> NORMAL* NEW -> COMPLETING -> EXCEPTIONAL* NEW -> CANCELLED* NEW -> INTERRUPTING -> INTERRUPTED*/private volatile int state;private static final int NEW          = 0;private static final int COMPLETING   = 1;private static final int NORMAL       = 2;private static final int EXCEPTIONAL  = 3;private static final int CANCELLED    = 4;private static final int INTERRUPTING = 5;private static final int INTERRUPTED  = 6;/** 需要执行的任务*/private Callable<V> callable;/**返回值 */private Object outcome; /**运行任务的线程*/private volatile Thread runner;/**表示等待线程的堆栈,在FutureTask的实现中,会通过CAS结合此堆栈交换任务的运行状态。*/private volatile WaitNode waiters;//状态大于CANCELLED 都返回true 表示成功取消public boolean isCancelled() {return state >= CANCELLED;}//只要状态不是NEW 都返回true 表示任务执行完成public boolean isDone() {return state != NEW;}public boolean cancel(boolean mayInterruptIfRunning) {//状态不是NEW 或者CAS返回值是false 则直接返回false,表示取消任务失败if (!(state == NEW &&UNSAFE.compareAndSwapInt(this, stateOffset, NEW,mayInterruptIfRunning ? INTERRUPTING : CANCELLED)))return false;try {    //如果mayInterruptIfRunning参数是true,则将运行任务的线程中断if (mayInterruptIfRunning) {try {Thread t = runner;if (t != null)t.interrupt();} finally { // final state//将状态置为INTERRUPTEDUNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED);}}} finally {finishCompletion();}return true;}private void finishCompletion() {// 定义一个循环 终止条件是waiters==nullfor (WaitNode q; (q = waiters) != null;) {//CAS成功之后,进入自旋循环if (UNSAFE.compareAndSwapObject(this, waitersOffset, q, null)) {for (;;) {//取出线程Thread t = q.thread;if (t != null) {//将线程置为nullq.thread = null;//恢复该线程,让其运行完毕LockSupport.unpark(t);}WaitNode next = q.next;//判断如果next没有引用 则直接breakif (next == null)break;q.next = null; // unlink to help gcq = next;}break;}}//子类实现done();//将任务置为nullcallable = null;        // to reduce footprint}public V get() throws InterruptedException, ExecutionException {//获取当前状态大于COMPLETINGint s = state;if (s <= COMPLETING)//则判断下一步如何执行,并返回其状态s = awaitDone(false, 0L);//根据返回的状态 获取任务执行的返回值return report(s);}public V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException {//这里同上 ,只不过加了超时判断if (unit == null)throw new NullPointerException();int s = state;if (s <= COMPLETING &&(s = awaitDone(true, unit.toNanos(timeout))) <= COMPLETING)//如果超时 直接抛出TimeoutException异常throw new TimeoutException();return report(s);}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()) {//如果线程异常了,则直接抛出InterruptedException异常removeWaiter(q);throw new InterruptedException();}int s = state;if (s > COMPLETING) {//如果状态大于COMPLETING,不论是正常执行完成还是异常了,都是执行完成了if (q != null)q.thread = null;//执行完成之后将执行任务线程置空,gcreturn s;//将完成任务之后的状态返回}//如果状态是 COMPLETING 则将线程礼让出去else if (s == COMPLETING) // cannot time out yetThread.yield();else if (q == null)//如果WaitNode未空 则创建一个q = new WaitNode();else if (!queued)//CASqueued = 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);}}public void run() {//状态不是NEW 或者CAS为false 直接返回if (state != NEW ||!UNSAFE.compareAndSwapObject(this, runnerOffset,null, Thread.currentThread()))return;try {//要执行的任务Callable<V> c = callable;//当前状态是NEWif (c != null && state == NEW) {V result;boolean ran;try {//调用call方法执行任务 接受返回值result = c.call();//将ran置为trueran = true;} catch (Throwable ex) {result = null;ran = false;setException(ex);}//代表正常执行,并且有返回值if (ran)//将返回值设置给outcome,并将状态更新set(result);}} finally {// runner must be non-null until state is settled to// prevent concurrent calls to run()runner = null;// state must be re-read after nulling runner to prevent// leaked interruptsint s = state;if (s >= INTERRUPTING)//如果异常 则线程礼让handlePossibleCancellationInterrupt(s);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch的衍生资源

PyTorch作为深度学习领域的一个重要框架&#xff0c;自2016年首次发布以来经历了显著的发展。以下是PyTorch发展过程中的几个关键里程碑事件&#xff1a; 2016年&#xff1a; PyTorch于2016年首次发布&#xff0c;作为一个基于动态计算图的开源机器学习库&#xff0c;它提供了自…

电磁波的空间辐射的几种传输形式

一般来说&#xff0c;波的传播方式与波长有关&#xff0c;如低频段的地波传播&#xff0c;极低频段的地—电离层波导传播&#xff0c;短波段的天波传播&#xff0c;甚高频&#xff0c;超高频的直线传播和散射传播方式等。绕射和透射是电磁波传输特性与环境的关系&#xff0c;属…

利用 Token Explorer 信号驾驭市场波动

市场波动使加密货币投资组合面临风险&#xff0c;但是通过 Token Explorer 分析&#xff0c;我们可以对波动进行建模&#xff0c;提前预测市场风险&#xff0c;并找到最安全的投资策略。通过综合考虑 Token 价格、交易量、社交媒体信息和链上交易等各种数据&#xff0c;我们可以…

Docker安装MySQL教程分享(附MySQL基础入门教程)

docker安装MySQL Docker可以通过以下命令来安装MySQL容器&#xff1a; 首先确保已经在计算机上安装了Docker。如果没有安装&#xff0c;请根据操作系统的不同进行相应的安装。 打开终端或命令提示符&#xff0c;并运行以下命令拉取最新版本的MySQL镜像&#xff1a; docker pu…

【转载】linux摄像头驱动

Linux摄像头驱动学习第一篇&#xff0c;对虚拟视频驱动Virtual Video Driver(vivid)进行测试、分析、编写。 V4L2(Video for Linux two)是Linux内核中关于视频设备的内核驱动框架&#xff0c;为上层的访问底层的视频设备提供了统一的接口。 V4L2可以支持多种设备,它可以有以下…

【进入游戏行业选游戏特效还是技术美术?】

进入游戏行业选游戏特效还是技术美术&#xff1f; 游戏行业正处于蓬勃发展的黄金时期&#xff0c;科技的进步推动了游戏技术和视觉艺术的飞速革新。在这个创意和技术挑战交织的领域里&#xff0c;游戏特效和技术美术岗位成为了许多人追求的职业目标。 这两个岗位虽然紧密关联…

开始读 Oracle PL/SQL Programming 第6版

最近觉得PL/SQL越来越重要&#xff0c;因为这本书早就在待读列表中&#xff0c;因此决定系统的学一下。 2024年1月24日晚开始读。 在亚马逊上的评价还不错&#xff1a; 本书的第一作者是Steven Feuerstein&#xff0c;是Oracle资深的Developer Advocate。 本书的示例代码可…

vue中如何写过滤器

全局注册 (可以在main.js中进行全局注册 vue.fifler(test’&#xff0c;function(v){return v0? ‘终止’&#xff1a;v1?进行中:异常 })在组件页面使用 <view>{{state|test}}</view> <script> export default {data(){return {state: 1// state 1 进行中…

如何实现激光雷达运动补偿,这篇就够了

目录 激光雷达为什么会存在运动畸变 激光雷达如何运动去畸变 C++实践激光雷达运动补偿(辅助传感器) 实践激光雷达ICP运动补偿 参考文献 激光雷达为什么会存在运动畸变 首先要理解为什么会产生运动畸变。激光雷达扫描物体形成点云的过程自身伴随着旋转运动,每次激…

索引统计信息是什么

索引统计信息&#xff08;Index Statistics&#xff09;是数据库中存储的关于表索引特征和数据分布的统计数据。这些统计信息帮助数据库的查询优化器&#xff08;Query Optimizer&#xff09;估计执行特定查询所需的成本&#xff0c;包括预测满足查询条件的行数、决定使用哪个索…

城市开发区视频系统建设方案:打造视频基座、加强图像数据治理

一、背景需求 随着城市建设的步伐日益加快&#xff0c;开发区已经成为了我国工业化、城镇化和对外开放的重要载体。自贸区、开发区和产业园的管理工作自然也变得至关重要。在城市经开区的展览展示馆、进出口商品展示交易中心等地&#xff0c;数千路监控摄像头遍布各角落&#…

【Docker】Docker学习⑤ - Docker数据管理

【Docker】Docker学习⑤ - Docker数据管理 一、Docker简介二、Docker安装及基础命令介绍三、Docker镜像管理四、Docker镜像与制作五、Docker数据管理1. 数据类型1.1 什么是数据卷&#xff08;data volume&#xff09;1.1.1 创建APP目录并生成web页面1.1.2 启动容器并验证数据1.…

面试常问的Spring AOP底层原理

AOP底层原理可以划分成四个阶段&#xff1a;创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段 第一阶段&#xff1a;创建代理对象阶段 通过getBean&#xff08;&#xff09;方法创建Bean实例根据AOP的配置匹配目标类的类名&#xff0c;判断是否满足切…

Termux结合内网穿透实现无公网ip远程SFTP传输文件

目录 前言 1. 安装openSSH 2. 安装cpolar 3. 远程SFTP连接配置 4. 远程SFTP访问 4. 配置固定远程连接地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Termux结合内网穿透实现无公网ip远程SFTP传输文件&#xff0c;希望大家能…

vue中单个页面设置多个上传组件

简述&#xff1a; 在最近的项目中&#xff0c;遇到单页面有多个上传图片的地方&#xff0c;如果每一个上传组件都写一个上传事件&#xff0c;在编码过程中又繁琐&#xff0c;后期维护也麻烦&#xff0c;最终在element-ui中找到了解决方法&#xff0c;在此记录一下。 html代码 …

RisingWave 存储引擎优化:更高的性能与更低的成本

1背景 在「Hummock &#xff1a;专为 RisingWave 流处理而设计的云原生存储引擎」一文中里我们已经介绍了 Hummock 的设计理念与基本架构&#xff0c;本文主要介绍 Hummock 近期几个版本的重大改进与优化 2Fast Compaction 在设计之初&#xff0c;Hummock 的数据文件格式参…

统计linux cpu已使用核心数目

查看cpu核心数 nproc 统计cpu负载 os.getoadavg() 15.09: 过去 1 分钟的平均负载。15.17: 过去 5 分钟的平均负载。15.74: 过去 15 分钟的平均负载。 这些数字表示系统在过去一段时间内的平均负载。平均负载是指在系统中运行或等待运行的进程数。通常&#xff0c;如果这些…

Lua 中的高级特性:模块的使用、字符串模式匹配、高阶函数和表的元方法

### 1. 模块的使用 在 Lua 中&#xff0c;模块是一种封装代码的方式&#xff0c;使得代码可以被重用。下面是一个简单的模块定义和使用的示例&#xff1a; lua -- 定义一个名为 mymodule 的模块 mymodule {} function mymodule.sayHello() print("Hello from my mo…

WinSCP如何使用公网TCP地址访问本地服务器

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

【pytorch框架】使用 PyTorch 进行深度学习

1.Pytorch介绍 PyTorch 是由 Facebook 创建和发布的用于深度学习计算的 Python 库。它起源于早期的库 Torch 7&#xff0c;但完全重写。 它是两个最受欢迎的深度学习库之一。PyTorch 是一个完整的库&#xff0c;能够训练深度学习模型以及在推理模式下运行模型&#xff0c;并支…