Java并发编程(六)ExecutorService

news2024/11/25 12:41:06

ExecutorService

invokeAny() he invokeAll() 具有阻塞特性

invokeAny

invokeAny 的作用是取得第一个完成任务的结果的值。
如果线程中增加 if (!Thread.currentThread().isInterrupted()) 判断,则会中断这些线程。
其他线程如果抛出 InterruptedException() 异常,且有一个线程可以正常运行时,主线程并不能捕获到。如果希望捕获需要主动增加 try-catch。
如果所有线程全部异常了 将返回最后一个异常并输出。
invokeAny 可以设置超时时间,超时后仍未返回结果,主线程则会捕获到超时异常。
如果只有一个线程 即超时 又 异常了 主线程会捕获到两个异常

public class MyExecutorService {

    public static class MyCallableA implements Callable {

        @Override
        public Object call() throws Exception {
            for (int i = 0; i < 10; i++){
                System.out.println("CallableA: " + i);
            }
            System.out.println("CallableA end");
            return "CallableA";
        }

    }

    public static class MyCallableB implements Callable {

        @Override
        public Object call() throws Exception {
            for (int i = 0; i < 20; i++){
                System.out.println("CallableB: " + i);
            }
            System.out.println("CallableB end");
            return "CallableB";
        }

    }

    public static class MyCallableC implements Callable {

        @Override
        public Object call() throws Exception {
            for (int i = 0; i < 30000; i++){
                if (!Thread.currentThread().isInterrupted()) {
                    System.out.println("CallableC: " + i);
                } else {
                    System.out.println("线程已被中断");
                    throw new InterruptedException();
                }
            }
            System.out.println("CallableC end");
            return "CallableC";
        }

    }


    public static void main(String[] args) throws ExecutionException, InterruptedException {
        List list =  new ArrayList<>();
        list.add(new MyCallableA());
        list.add(new MyCallableB());
        ExecutorService executorService = Executors.newCachedThreadPool();
        Object o = executorService.invokeAny(list);
        System.out.println("result: " + o);
    }
}

A线程已经执行结束,但B线程仍在继续执行。
在这里插入图片描述
调整main方法


    public static void main(String[] args) throws ExecutionException, InterruptedException {
        List list =  new ArrayList<>();
        list.add(new MyCallableA());
        list.add(new MyCallableC());
        ExecutorService executorService = Executors.newCachedThreadPool();
        Object o = executorService.invokeAny(list);
        System.out.println("result: " + o);
    }

可以看到MyCallableC终止运行
在这里插入图片描述

invokeAll

invokeAll用来发挥所有任务的执行结果,在所有任务都返回前将会阻塞线程。
如果有线程执行异常了, 则会讲异常作为返回值返回
和invokeAny异常 都可以设置超时时间 超时后主线程捕获到 Timeout异常

public class MyExecutorService {

    public static class MyCallableA implements Callable {

        @Override
        public Object call() throws Exception {
            for (int i = 0; i < 5; i++){
                System.out.println("CallableA: " + i);
            }
            System.out.println("CallableA end");
            return "CallableA";
        }

    }

    public static class MyCallableC implements Callable {

        @Override
        public Object call() throws Exception {
            for (int i = 0; i < 5; i++){
                if (!Thread.currentThread().isInterrupted()) {
                    System.out.println("CallableC: " + i);
                } else {
                    System.out.println("线程已被中断");
                    throw new RuntimeException();
                }
            }
            System.out.println("CallableC end");
            return "CallableC";
        }

    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        List list =  new ArrayList<>();
        list.add(new MyCallableC());
        list.add(new MyCallableA());
        ExecutorService executorService = Executors.newCachedThreadPool();
        List<Future<String>> result = executorService.invokeAll(list);
        for (Future future : result) {
            System.out.println("result: " + future.get());
        }
        System.out.println("main end");
    }
}

在这里插入图片描述
修改MyCallableC class

public static class MyCallableC implements Callable {

        @Override
        public Object call() throws Exception {
            for (int i = 0; i < 5; i++){
                if (!Thread.currentThread().isInterrupted()) {
                    System.out.println("CallableC: " + i);
                } else {
                    System.out.println("线程已被中断");
                    throw new RuntimeException();
                }
            }
            if ( 1==1) {
                System.out.println("CallableC 异常了");
                throw new RuntimeException();
            }
            System.out.println("CallableC end");
            return "CallableC";
        }

    }

可以看到 主线程阻塞住了 这里需要对。main重的 future 增加 tryCatch
在这里插入图片描述

修改main方法 增加 try-catch

public static void main(String[] args) throws ExecutionException, InterruptedException {
        List list =  new ArrayList<>();
        list.add(new MyCallableC());
        list.add(new MyCallableA());
        ExecutorService executorService = Executors.newCachedThreadPool();
        List<Future<String>> result = executorService.invokeAll(list);
        for (Future future : result) {
            try {
                System.out.println("result: " + future.get());
            }catch (ExecutionException e){
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        }
        System.out.println("main end");
    }

可以看到其他线程的返回值也获取到了
在这里插入图片描述

ExecutorService 中的方法都以便携的方式创建线程池,使用两个主要的方法 invokeAny 获取第一个执行结束的线程的结果 invokeAll 获取所有线程的执行结果

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

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

相关文章

从徘徊迷茫到行业精英,社科院与杜兰大学金融管理硕士改变你的人生轨迹

在以“内卷”为主基调的职场环境里&#xff0c;似乎不停地进阶已经成为了职场人的唯一出路。但是&#xff0c;如何在进阶路上冲破职业瓶颈&#xff0c;到达心之所往的理想位置&#xff0c;则没有一个标准的答案。有的职场人士通过考取不同的技能证书来增加自身优势&#xff0c;…

Java Agent 踩坑之 appendToSystemClassLoaderSearch 问题

作者&#xff1a;卜比 本文是《容器中的 Java》系列文章之 2/n&#xff0c;欢迎关注后续连载 &#x1f603; 。 从 Java Agent 报错开始&#xff0c;到 JVM 原理&#xff0c;到 glibc 线程安全&#xff0c;再到 pthread tls&#xff0c;逐步探究 Java Agent 诡异报错。 背景 …

数据分析,你还在单纯地看数据?

企业的数字化意识越来越强&#xff0c;工作中也开始使用各种业务系统来管理业务&#xff0c;管理数据。很多人以为上了业务系统&#xff0c;对数据进行统计了&#xff0c;就是数据分析&#xff0c;这是大错特错的观点&#xff0c;数据分析是通过数据来剖析企业经营管理和业务发…

Using chatbots to scaffold EFL students argumentative writing (论文翻译)

使用聊天机器人来指导学生的议论文写作摘要研究表明&#xff0c;英语作为外语的学生的议论文写作受益于与同龄人的互动。然而&#xff0c;在实践中找到一个理想的对象很困难&#xff0c;聊天机器人被认为是这个问题的潜在解决方案。聊天机器人是人工智能的一种形式&#xff0c;…

Studio One6最新更新教程及安装包下载

Studio One6拥有多达50款原生效果插件&#xff0c;例如Analog Delay延迟插件&#xff0c;除能制作延迟效果外&#xff0c;还提供了制作复古的镶边与和声效果。Rotor插件制作的经典旋转扬声器效果也是非常不错的。这些插件&#xff0c;无论是在用户界面&#xff0c;还是使用体验…

http-serve开启一个服务器

前言在写前端页面中&#xff0c;经常会在浏览器运行HTML页面&#xff0c;从本地文件夹中直接打开的一般都是file协议&#xff0c;当代码中存在http或https的链接时&#xff0c;HTML页面就无法正常打开&#xff0c;为了解决这种情况&#xff0c;需要在在本地开启一个本地的服务器…

70. 爬楼梯

70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示例 2&am…

如何将python脚本打包成可执行exe文件

如何将python脚本打包成可执行exe文件 前提条件 1. 新建一个python项目&#xff0c;并且配置虚拟环境 2. 安装pyinstaller 打包EXE文件 写一个支持入参的python脚本&#xff0c;打包成exe文件 找一张图片作为exe文件的图标 百度搜索” 在线jpg转cio”,将图片转换成cio格式 …

MySQL基础篇第11章(数据处理之增删改)

1.插入数据 1.1 实际问题 1.2 方式1&#xff1a;VALUES的方式添加 使用这种语法一次只能向表中插入一条数据。 情况1&#xff1a;为表的所有字段按默认顺序插入数据 INSERT INTO 表名 VALUES (value1,value2,....);值列表中需要为表的每一个字段指定值&#xff0c;并且值的…

MTIC工业大脑,海量接入网关!

MTIC3.0工业大脑是高性能&#xff0c;高可靠性的低代码开发数据核心平台&#xff0c;支持上万级别的网关设备同时在线&#xff0c;提供标准版本业务系统&#xff0c;可实现多业主工程项目并行管理&#xff0c;吸取大型物联网数据监测工程专家建议&#xff0c;实现项目精细化管理…

什么是DPU

什么是DPU 什么是 DPU&#xff1f; 在数据中心、DPU 或数据处理单元中移动数据的专家是一种新型的可编程处理器&#xff0c;将与 CPU 和 GPU 一起成为计算的三大支柱之一。 当然&#xff0c;您可能已经熟悉中央处理器。 多年来&#xff0c;CPU 是大多数计算机中唯一的可编程元…

如何避免成为背锅侠?

你被同事甩过锅吗&#xff1f; 打工人在职场中犯错都是不可避免的。 但明明不是自己的问题&#xff0c;还要背个黑锅&#xff0c;就非常闹心了&#xff01; 大家好&#xff0c;我是大D。 前几天&#xff0c;大D开发完了一个项目&#xff0c;在交付验收中发现业务逻辑存在漏洞&a…

java swing人机对战五子棋(含背景音乐)

一、项目简介 本项目是一套基于java swing的人机对战五子棋系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xf…

java BigDecimal保留两位小数

对于一些精准的数字&#xff0c;如涉及到金额时我们一般会使用BigDecimal类型来保存和处理。在处理保留小数位数时&#xff0c;如果通过DecimalFormat表达式需要注意下。 1、通过DecimalFormat保留两位小数 通过上图可以看到&#xff0c;#在补位时&#xff0c;如果该位没有数…

C/C++入门005-C语言数组

文章目录C语言数组数组的基本概念及定义数组定义数组中的几个名词数组长度计算方法二维数组的含义二维数组的定义字符数组字符函数1. strlen 计算字符串长度2. strcpy 字符串拷贝3. strcat 字符串追加4. strcmp 字符串比较1. strncpy 字符串拷贝3. strncmp 字符串比较4. strstr…

【web安全】——web渗透的前缀知识

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门 创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座…

海康摄像头CVE-2021-36260漏洞复现

海康摄像头CVE-2021-36260漏洞复现1.漏洞介绍2.手动测试2.1.摄像头版本2.2.漏洞复现2.2.1.更改URL2.2.2.抓包修改数据2.2.3.更换请求路径2.2.4.后期利用3.POC测试3.1.下载POC3.2.运行POC3.3.测试漏洞3.4.执行命令1.漏洞介绍 攻击者利用该漏洞可以用无限制的 root shell 来完全控…

Internet Download Manager6.41加速器最快的电脑工具下载器

IDM下载器&#xff0c;全称是Internet Download Manager&#xff0c;中文是互联网下载管理器可以说是最好用下载速度最快的下载器&#xff0c;可以利用全部带宽多线程下载&#xff0c;让你的下载速度起飞&#xff01; 提到下载工具&#xff0c;大多数国人映入脑海的或许是迅雷…

优雅应对故障:QQ音乐怎么做高可用架构体系?

导语 | 故障是开发者高频关注的问题。在分布式系统建设的过程中&#xff0c;我们思考的重点不是避免故障&#xff0c;而是拥抱故障&#xff0c;通过构建高可用架构体系来获得优雅应对故障的能力。本文作者冯煦亮从架构、工具链、可观测三个维度&#xff0c;介绍了QQ音乐多年来积…

迅速配置hadoop Xshell 会话(安装java和jdk)

安装 yum install -y epel-release 防火墙 systemctl stop firewalld systemctl disable firewalld.service root权限 vim /etc/sudoers yy p 创建文件夹 mkdir /opt/module mkdir /opt/software chown hhh:hhh /opt/module/ chown hhh:hhh /opt/software/ cd /opt/ ll 卸…