Future和FutureTask

news2024/11/17 8:19:45

Future和FutureTask

  • Future类
  • Future主要方法
    • get()
    • get(long timeout,TimeUnit unit)
    • cancel()
    • isDone()
    • isCancelled()
  • 用线程池的submit方法返回Future对象
  • 用FutureTask来创建Future

Future类

FutureTask叫未来任务,可以将一个复杂的任务剔除出去交给另外一个线程来完成
在这里插入图片描述

Future主要方法

get()

get方法的行为取决于Callable任务的状态,只有以下5种情况:

  1. 任务正常完成:get方法会立刻返回结果
  2. 任务尚未完成:任务还没有开始或进行中,get将阻塞并直到任务完成。
  3. 任务执行过程中抛出Exception:get方法会抛出ExecutionException,这里抛出异常,是call()执行
    时产生的那个异常
  4. 任务被取消:get方法会抛出CancellationException
  5. 任务超时:get方法有一个重写方法,是传入一个延迟时间的,如果时间到了还没有获得结果,get方法会抛出TimeoutException

get(long timeout,TimeUnit unit)

如果call()在规定时间内完成任务,那么就会正常获取到返回值,而如果在指定时间内没有计算出结果, 则会抛出TimeoutException

cancel()

  • 如果这个任务还没有开始执行,任务会被正常取消,未来也不会被执行,返回true
  • 如果任务已经完成或已经取消,则cancel()方法会执行失败,方法返回false
  • 如果这个任务已经开始,这个取消方法将不会直接取消该任务,而是会根据参数 mayInterruptIfRunningg来做判断。如果是true,就会发出中断信号给这个任务。

isDone()

  • 判断线程是否执行完,执行完并不代表执行成功。

isCancelled()

  • 判断是否被取消

用线程池的submit方法返回Future对象

首先要给线程池提交任务,提交时线程池会立刻返回一个空的Future容器。当线程的任务一旦执行完, 也就是当我们可以获取结果时,线程池会把该结果填入到之前给我们的那个Future中去(而不是创建一 个新的Future),我们此时可以从该Future中获得任务执行的结果。

/**
 * 案例:演示一个Future的使用方法
 */
public class Demo22Future {
    public static void main(String[] args) {

        ExecutorService service = Executors.newFixedThreadPool(10);
        Future<Integer> future = service.submit(new CallableTask());

        try {
            //等待3秒后打印
            System.out.println(future.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        service.shutdown();
    }

    static class CallableTask implements Callable<Integer> {
        @Override
        public Integer call() throws Exception {
            Thread.sleep(3000);
            return new Random().nextInt();
        }
    }
}

用FutureTask来创建Future

用FutureTask来获取Future和任务的结果。FutureTask实现Runnable和Future接口
在这里插入图片描述
把Callable实例当作参数,生成FutureTask的对象,然后把这个对象当作一个Runnable对象,用线程池 去执行这个Runnable对象,最后通过FutureTask获取刚才执行的结果。

/**
 * 案例:演示FutureTask的用法
 */
public class Demo23FutureTask {

    public static void main(String[] args) {
        Demo23FutureTask.Task task = new Demo23FutureTask.Task();
        //FutureTask继承Future和Runnalbe接口
        FutureTask<Integer> integerFutureTask = new FutureTask<>(task);

        //new Thread(integerFutureTask).start();

        ExecutorService service = Executors.newCachedThreadPool();
        service.submit(integerFutureTask);

        try {
            System.out.println("task运行结果:"+integerFutureTask.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
    static class Task implements Callable<Integer> {
        @Override
        public Integer call() throws Exception {
            System.out.println("子线程正在计算");
            Thread.sleep(3000);
            //模拟子线程处理业务逻辑
            int sum = 0;
            for (int i = 0; i < 100; i++) {
                sum += i;
            }
            return sum;
        }
    }
}

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

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

相关文章

基于LLM的Agent的兴起及其潜力:综述

原文链接&#xff1a;https://arxiv.org/pdf/2309.07864v1.pdf 1. Introduction LLM-based Agent的基本构成。本文认为&#xff0c;构成LLM-based Agent的核心部件有三个&#xff1a; brain: 主要目标有2个—信息记忆、信息处理perception: 主要目标在于让agent能够感受到更…

0207作业

继承&#xff1a;是 C中类的一个重要特性&#xff0c;它允许一个类从另一个类中继承成员变量和成员函数。通过继承&#xff0c;可以在子类中重用父类的代码&#xff0c;并可以根据需要进行扩展和修改。继承关系形成了类的层次结构。 虚继承&#xff1a;是一种特殊的继承方式&a…

林浩然与杨凌芸的Java奇缘:final关键字的三次浪漫邂逅

林浩然与杨凌芸的Java奇缘&#xff1a;final关键字的三次浪漫邂逅 Lin Haoran and Yang Lingyun’s Java Romance: Three Romantic Encounters with the “final” Keyword 在一个名叫“编程乐园”的世界里&#xff0c;住着两位才子佳人——男主角林浩然和女主角杨凌芸。他们不…

【翻译】 Processing的安卓项目构建(译者用的是Android Studio)

原文链接&#xff1a;https://github.com/processing/processing-android/wiki/Building-Processing-for-Android&#xff0c;版本Apr 2, 2023 译者声明&#xff1a;这个文档是开源公开的&#xff0c;协议是GNU协议。译者自己得使用这个文档&#xff0c;所以才翻译的&#xff0…

Windows Server 2019 DHCP服务器搭建

系列文章目录 目录 系列文章目录 文章目录 前言 一、DHCP服务器是什么&#xff1f; 二、配置服务器 1.实验环境搭建 1)实验服务器配置和客户端 2)实验环境 2.服务器配置 ​编辑 文章目录 Windows Server 2003 Web服务器搭建Windows Server 2003 FTP服务器搭建Windows S…

【Java 数据结构】反射

反射 1 定义2 用途(了解)3 反射基本信息4 反射相关的类&#xff08;重要&#xff09;4.1 Class类(反射机制的起源 )4.1.1 Class类中的相关方法(方法的使用方法在后边的示例当中) 4.2 反射示例4.2.1 获得Class对象的三种方式4.2.2 反射的使用 5、反射优点和缺点 1 定义 Java的反…

YOLOv8改进 更换轻量级网络结构

一、GhostNet论文 论文地址:1911.11907.pdf (arxiv.org) 二、 GhostNet结构 GhostNet是一种高效的目标检测网络,具有较低的计算复杂度和较高的准确性。该网络采用了轻量级的架构,可以在计算资源有限的设备上运行,并能够快速地实时检测图像中的目标物体。 GhostNet基于Mo…

Linux常见命令总结

1.目录操作 1. 切换目录 &#xff08;cd&#xff09; ①切换到指定目录下 cd 目录名 ②切换到根目录下 cd ~ 2. 查看目录 &#xff08;ls&#xff09; ①查看当前目录下的所有目录和文件 ls ②查看当前目录下的所有目录和文件&#xff08;包括隐藏的文件&#xff09;ls…

怎么加密电脑磁盘?磁盘加密软件哪个好?

磁盘是电脑储存数据的基础工具&#xff0c;可以存放大量数据。为了避免数据泄露&#xff0c;可以使用专业的磁盘加密软件加密保护电脑磁盘。那么&#xff0c;磁盘加密软件哪个好呢&#xff1f;下面我们就来了解一下。 磁盘加锁专家 磁盘加锁专家是一款专业的磁盘加锁软件&…

cesium mapboxgl+threebox glb 朝向问题

一、3Dbuilder打开glb 二、cesium在pitch和heading都为0的情况下&#xff0c;不设置模型的朝向 三、mapboxglthreebox在pitch和bearing都为0的情况下&#xff0c;不设置模型的朝向 四、对于地图默认视角&#xff0c;cesium设置pitch-90、heading0的时候和mapboxglthreebox设置p…

使用python绘制无边框ECG信号-可用于论文插图-小白版

用python绘制一个心电信号 最近在写大论文&#xff0c;由于自己做的是心电信号难免要做一些心电信号的插图&#xff0c;然后在写论文的时候有的时候要用真实信号有的时候需要用到示意图&#xff0c;这里面的其他部分使用Visio绘制的&#xff0c;但是前面的心电信号部分&#x…

寒假作业:2024/2/3

作业1&#xff1a;编程实现单向循环链表的头插、头删、尾插、尾删 1.头插&#xff1a; 代码&#xff1a; #include "head.h" /** function: 单向循环链表新节点创建* param [ in] * param [out] * return 成功返回创建的节点&#xff0c;失败NULL*/ loop_…

SM2259XT量产工具修复金泰克固态硬盘29F01T2ALCQJ1颗粒开卡

在这里插入代码片前言 网心云用的固态硬盘突然坏了识别不了&#xff0c;磁盘管理、diskGenius、pe系统里均无法识别&#xff0c;查询发现可以用开卡工具修复&#xff0c;遂进行了一番折腾。 拆硬盘 如图硬盘是块金泰克240g容量的&#xff0c;拆开后找到主控芯片型号为SM2259…

思科模拟器实验合集

目 录 实验一 常用网络命令的使用.................................... 1 实验二 双绞线制作.................................................. 12 实验三 网络模拟软件.............................................. 15 实验四 交换机基本配置..................…

使用vite创建vue+ts项目,整合常用插件(scss、vue-router、pinia、axios等)和配置

一、检查node版本 指令&#xff1a;node -v 为什么要检查node版本&#xff1f; Vite 需要 Node.js 版本 18&#xff0c;20。然而&#xff0c;有些模板需要依赖更高的 Node 版本才能正常运行&#xff0c;当你的包管理器发出警告时&#xff0c;请注意升级你的 Node 版本。 二、创…

SpringBoot:web开发

web开发demo&#xff1a;点击查看 LearnSpringBoot05Web 点击查看更多的SpringBoot教程 技术摘要 webjarsBootstrap模板引擎thymeleaf嵌入式Servlet容器注册web三大组件 一、webjars webjars官网 简介 简介翻译 WebJars 是打包到 JAR&#xff08;Java Archive&#xff09;…

Java线程是怎么实现run方法的执行的呢?【 多线程在JVM中的实现原理剖析】

Java线程是怎么实现run方法的执行的呢&#xff1f;【 多线程在JVM中的实现原理剖析】 查看naive state0 方法JVM_StartThread 方法创建操作系统线程操作系统线程执行 本文转载-极客时间 我们知道Java线程是通过行start()方法来启动的&#xff0c;线程启动后会执行run方法内的代…

【Spring基础】从0开始学习Spring(2)

前言 在上篇文章&#xff0c;我已经讲了Spring中最核心的知识点&#xff1a;IoC&#xff08;控制反转&#xff09;以及DI&#xff08;依赖注入&#xff09;。这篇文章&#xff0c;我将讲一下关于Spring框架中的其它比较琐碎但是又还是挺重要的知识点&#xff0c;因此&#xff…

Excel——有效性、二级菜单联动

一、录入规范数据 1.手动输入序列录入有效性信息 选择需要录入有效性的所有单元格 选择【数据】——【有效性】——【有效性】 在【允许】输入的值之间选择【序列】 在【序列】输入框中输入想要选择的值&#xff0c;中间用逗号&#xff08;必须是英文逗号&#xff09;隔开 。…

[C/C++] -- Boost库、Muduo库编译安装使用

1.Muduo库 Muduo 是一个基于 C11 的高性能网络库&#xff0c;其核心是事件驱动、非阻塞 I/O、线程池等技术&#xff0c;以实现高并发、高性能的网络通信。Muduo 库主要由陈硕先生开发维护&#xff0c;已经成为 C 服务器程序员的常用工具之一。 Muduo 库的主要特点&#xff1a…