Java进阶篇--线程池之FutureTask

目录

FutureTask简介

FutureTask的基本使用

FutureTask的应用场景


FutureTask简介

FutureTask是Java中的一个类,用于表示可获取结果的异步任务。它实现了java.util.concurrent.Future接口,提供了启动和取消异步任务、查询任务是否已完成以及获取最终结果的方法。通过调用get()方法可以获取异步任务的结果,但会阻塞当前线程直至任务执行结束。一旦任务执行结束,任务不能重新启动或取消,除非调用runAndReset()方法。在FutureTask的源码中定义了多种状态,包括

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;

根据FutureTask.run()方法的执行的时机,FutureTask分为了3种状态:

1、未启动状态:指的是在创建FutureTask后,但尚未执行FutureTask.run()方法之前,FutureTask处于未启动状态。

2、已启动状态:指的是FutureTask.run()方法正在被执行的过程中,此时FutureTask处于已启动状态。

3、已完成状态:包括了三种情况:

  • FutureTask.run()方法执行结束;
  • 调用FutureTask.cancel(…)方法取消任务;
  • 在执行任务期间抛出异常。

以上三种情况都属于FutureTask的已完成状态。

对于FutureTask的get()方法和cancel()方法,它们在不同状态下的行为总结如下:

1、get方法:

  • 当FutureTask处于未启动或已启动状态时,执行FutureTask.get()方法将导致调用线程阻塞,直到任务执行完成并返回结果。
  • 如果FutureTask处于已完成状态,调用FutureTask.get()方法将立即返回结果或者抛出异常。

2、cancel方法:

  • 当FutureTask处于未启动状态时,执行FutureTask.cancel()方法将任务标记为已取消,但不会影响当前未启动的任务。
  • 当FutureTask处于已启动状态时,执行FutureTask.cancel(true)方法将以中断线程的方式来阻止任务继续进行,如果执行FutureTask.cancel(false)将不会对正在执行任务的线程有任何影响,任务会继续执行直至结束。
  • 当FutureTask处于已完成状态时,执行FutureTask.cancel(…)方法将返回false,表示无法取消已经完成的任务。

FutureTask的基本使用

FutureTask除了实现了Future接口,还实现了Runnable接口,这使得它既可以作为一个异步任务,也可以作为一个可执行的任务被线程执行。因此,它可以交给Executor执行,也可以由调用的线程直接执行(FutureTask.run())。另外,通过ExecutorService的submit()方法也可以返回一个FutureTask对象,然后可以通过FutureTask.get()或者FutureTask.cancel方法获取结果或取消任务的执行。

以下是一个简单的示例,演示了如何使用FutureTask来实现多线程任务的协调和管理,

import java.util.concurrent.*;public class main {public static void main(String[] args) {// 创建一个FutureTask对象FutureTask<Integer> futureTask = new FutureTask<>(() -> {// 模拟一个耗时的任务,这里使用Thread.sleep来模拟Thread.sleep(2000);return 42; // 返回结果});// 创建一个线程池ExecutorService executor = Executors.newFixedThreadPool(1);// 使用线程池执行FutureTaskexecutor.execute(futureTask);// 在主线程中可以做一些其他的事情try {// 获取FutureTask的结果,如果任务还未完成,则会阻塞当前线程直到任务完成int result = futureTask.get();System.out.println("任务执行结果:" + result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}// 关闭线程池executor.shutdown();}
}

在这个示例中,我们创建了一个FutureTask对象来执行一个耗时的任务,然后将它交给线程池来执行。在主线程中,我们可以做一些其他的事情,然后通过futureTask.get()方法来获取任务的执行结果。如果任务还未完成,get()方法会阻塞当前线程直到任务完成。

这个示例展示了如何使用FutureTask来实现异步任务的执行和结果获取,同时也展示了使用ExecutorService来执行线程任务,并在任务完成后关闭线程池。

FutureTask的应用场景

在实际应用中,FutureTask通常用于以下场景:

  • 需要等待其他线程执行完毕后再继续执行:通过FutureTask可以将需要等待的任务封装起来,然后在需要等待的地方调用其get()方法,当前线程就会阻塞,直到任务执行完毕并返回结果。
  • 多个线程执行同一个任务的控制:可以使用FutureTask来保证多个线程对同一个任务的执行是有序的,例如只允许一个线程执行任务,其他线程需要等待任务执行完毕后才能继续。

总的来说,FutureTask提供了一种方便的方式来管理异步任务的执行和获取结果,同时也可以用于多线程任务的协调与控制。当需要在多线程环境下进行任务调度和管理时,FutureTask是一个非常有用的工具。

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

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

相关文章

腾讯云3年云服务器价格及购买教程

腾讯云作为国内领先的云计算服务提供商&#xff0c;提供了多种优惠的云服务器套餐&#xff0c;以满足不同用户的需求&#xff0c;本文将详细介绍腾讯云3年云服务器价格及购买教程&#xff0c;新老用户均可购买&#xff01; 1、活动页面&#xff1a;传送门>>> 2、进入…

P3379 【模板】最近公共祖先(LCA)

洛谷里面8页题解千篇一律&#xff0c;就没有用线段树求解的&#xff0c;这下不得不由本蒟蒻来生啃又臭又硬&#xff0c;代码又多的线段树了。 样例的欧拉序列&#xff1a;4 2 4 1 3 1 5 1 4 记录每个节点最早在欧拉序列中的时间&#xff0c;任意两个节点的LCA就是他们两个节点…

Flink -- 状态与容错

1、Stateful Operations 有状态算子&#xff1a; 有状态计算&#xff0c;使用到前面的数据&#xff0c;常见的有状态的算子&#xff1a;例如sum、reduce&#xff0c;因为它们在计算的时候都是用到了前面的计算的结果 总结来说&#xff0c;有状态计算并不是独立存在的&#xf…

ssh免密登录

单机 1 生成密钥 执行 ssh-keygen -t rsa &#xff08; 其中 rsa 是非对称算法&#xff09; 一路回车到底&#xff0c;生成密钥 且生成之后会在用户的根目录生成一个 “.ssh”的文件夹 2 添加公钥到 将 公钥内容追加到 authorized_keys 中&#xff1a; cat ~/.ssh/id_rsa.pub …

汽车网络安全渗透测试概述

目录 1.汽车网络安全法规概述 1.1 国外标准 1.2 国内标准 2.汽车网络安全威胁分析 2.1 汽车网络安全资产定义 2.2 汽车网络安全影响场景及评级示例 3.汽车网络安全渗透测试描述 3.1 参考法规 3.2 渗透测试内容 4.小结 1.汽车网络安全法规概述 近年来&#xff0c;汽车…

科技创意赋能乡村文旅振兴

近日&#xff0c;由北京大学创意产业研究中心联合中国国际科技促进会新基建专委会共同主办的“科技创意赋能乡村振兴研讨会”在京举行&#xff0c;与会专家学者围绕“和美乡村共同富裕智慧文旅”主题进行深入探讨。北京大学创意产业研究中心副主任吕艺、国家文化和旅游公共服务…

Android UI 开发·界面布局开发·案例分析

目录 ​编辑 1. 线性布局&#xff08;LinearLayout&#xff09; 2. 相对布局&#xff08;RelativeLayout&#xff09; 3. 表格布局&#xff08;TableLayout&#xff09; 4. 帧布局&#xff08;FrameLayout&#xff09; 5. 网格布局&#xff08;GridLayout&#xff0…

Linux 学习(CentOS 7)

CentOS 7 学习 Linux系统内核作者: Linux内核版本 内核(kernel)是系统的心脏&#xff0c;是运行程序和管理像磁盘和打印机等硬件设备的核心程序&#xff0c;它提供了一个在裸设备与应用程序间的抽象层。 Linux内核版本又分为稳定版和开发版&#xff0c;两种版本是相互关联&am…

【小白专用】VSCode下载和安装与配置PHP开发环境(详细版) 23.11.08

1. 下载VSCode2. 解决VSCode下载速度特别慢3. 安装VSCode 一、VSCode介绍 VSCode 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git 版本控制系统。 二、官方下载地址…

网络带宽基础知识简单介绍

网络带宽基础知识简单介绍 前言一、网络带宽是什么&#xff1f;二、影响网络带宽的因素三、网络带宽的单位总结 前言 最近一些需求涉及到了网络带宽&#xff0c;整理后有了本文 一、网络带宽是什么&#xff1f; 网络带宽是指在单位时间内&#xff08;一般指的是1秒钟&#xf…

django+drf+vue 简单系统搭建 (1) - django创建项目

本系列文章为了记录自己第一个系统生成过程&#xff0c;主要使用django,drf,vue。本人非专业人士&#xff0c;此文只为记录学习&#xff0c;若有部分描述不够准确的地方&#xff0c;烦请指正。 建立这个系统的原因是因为&#xff0c;在生活中&#xff0c;很多觉得可以一两行代码…

Flutter的专属Skia引擎解析+用法原理

Skia是一款跨平台的2D图形库&#xff0c;是Google公司开发的&#xff0c;可以用于开发各种应用程序&#xff0c;如浏览器、游戏、移动应用程序等。Skia引擎的主要特点是速度快、可移植性强、占用的内存少、稳定性佳&#xff0c;适用于多种硬件平台。 Skia的目标是提供快速、高…

基于GCC的工具objdump实现反汇编

一&#xff1a;objdump介绍 在 Linux中&#xff0c;一切皆文件。 Linux 编程实际上是编写处理各种文件的代码。系统由许多类型的文件组成&#xff0c;但目标文件具有一种特殊的设计&#xff0c;提供了灵活和多样的用途。 目标文件是包含带有附加地址和值的助记符号的路线图。这…

kubernetes集群编排(7)

目录 k8s认证授权 pod绑定sa 认证 授权 k8s认证授权 pod绑定sa [rootk8s2 ~]# kubectl create sa admin //在当前 Kubernetes 集群中创建一个名为 "admin" 的新服务账户[rootk8s2 secret]# vim pod3.yaml apiVersion: v1 kind: Pod metadata:name: mypod spec…

Paste v4.1.2(Mac剪切板)

Paste for Mac是一款运行在Mac OS平台上的剪切板小工具&#xff0c;拥有华丽的界面效果&#xff0c;剪切板每一条记录可显示&#xff08;预览&#xff09;文本&#xff0c;图片等记录的完整内容&#xff0c;可以记录最近指定条数的剪切板信息&#xff0c;方便用户随时调用&…

软件测试入门之接口测试

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

思维模型 首因效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。先入为主&#xff0c;一见钟情。 1 首因效应的应用 1.1 面试中的首因效应 小李是一名应届毕业生&#xff0c;他准备参加一家知名互联网公司的面试。在面试前&#xff0c;他做了充分的准备…

NIO 笔记(一)基础内容

【笔记来自&#xff1a;it白马】 NIO基础 **注意&#xff1a;**推荐完成JavaSE篇、JavaWeb篇的学习再开启这一部分的学习&#xff0c;如果在这之前完成了JVM篇&#xff0c;那么看起来就会比较轻松了。 在JavaSE的学习中&#xff0c;我们了解了如何使用IO进行数据传输&#xf…

使用Plsql+oracle client 连接 Oracle数据库

2011年入职老东家X煤集团的时候&#xff0c;在csnd上写了一篇blog&#xff0c;题目叫“什么是ERP”&#xff0c;从此跳入DBA了这个烂坑&#xff0c;目前公司的数据库一部分是Oracle&#xff0c;另一部分是MySQL的&#xff0c;少量MSSQL&#xff0c;还需要捡起来一部分&#xff…

【JAVA学习笔记】65 - 文件类,IO流--节点流、处理流、对象流、转换流、打印流

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter19/src/com/yinhai 文件 一、文件&#xff0c;流 文件,对我们并不陌生&#xff0c;文件是保存数据的地方,比如大家经常使用的word文档,txt文件,excel文件..都是文件。它既可以保存一张图片…