【线程池】ThreadPoolExecutor的使用示例

文章目录

    • 通过ThreadPoolExecutor创建线程池。
    • 线程的处理结果如何获取?

通过ThreadPoolExecutor创建线程池。

ThreadPoolExecutor构造方法参数:

  • int corePoolSize //核心线程数量
  • int maximumPoolSize//最大线程数
  • long keepAliveTime//当线程数大于核心线程数时,多余空闲线程存活的最长时间
  • TimeUnit unit//keepAliveTime的时间单位
  • BlockingQueue<Runnable> workQueue//任务队列,用来储存等待执行任务的队列
  • ThreadFactory threadFactory//用来创建线程的线程工厂,一般默认
  • RejectedExecutionHandler handler//拒绝策略,当提交的任务过多而不能及时处理时所执行的处理策略

演示使用ThreadPoolExecutor执行任务


import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class TestThreadPool {public static void main(String[] args) {// 创建一个线程池ThreadPoolExecutor executor = new ThreadPoolExecutor(5,  // 核心线程数5,  // 最大线程数2,  // 当线程数大于核心线程数时,多余的空闲线程存活的最长时间TimeUnit.SECONDS,  // 存活时间单位new LinkedBlockingQueue<>(10)  // 任务队列,用来储存等待执行任务的队列);// 提交任务给线程池for (int i = 0; i < 10; i++) {final int taskId = i;executor.submit(new Runnable() {@Overridepublic void run() {System.out.println("Task " + taskId + " is being executed by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行时间} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Task " + taskId + " is completed");}});}// 关闭线程池executor.shutdown();}
}

在这个示例中,使用 ThreadPoolExecutor 创建了一个线程池,提交了 10 个任务给线程池,线程池会根据核心线程数和任务队列的情况来分配线程执行任务。任务执行完毕后,线程池会复用线程,如果线程池中的线程数量超过核心线程数,空闲线程在空闲时间后可能会被回收。

最后,调用 shutdown 方法关闭线程池,等待所有任务完成后关闭。

代码运行:
在这里插入图片描述

上述代码中的,提交任务给线程池时所调用的submit也可更改为execute方法。

execute 适用于只关心任务的执行,不需要获取返回值或处理异常的情况;submit 适用于需要获取任务的执行结果或捕获异常的情况。

ThreadPoolExecutor类:
在这里插入图片描述
AbstractExecutorService抽象类(ThreadPoolExecutor的父类):
在这里插入图片描述

线程的处理结果如何获取?

代码:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;public class TestThreadPool2 {public static void main(String[] args) {// 创建一个线程池ThreadPoolExecutor executor = new ThreadPoolExecutor(5,  // 核心线程数5,  // 最大线程数2,  // 当线程数大于核心线程数时,多余的空闲线程存活的最长时间TimeUnit.SECONDS,  // 存活时间单位new LinkedBlockingQueue<>(10)  // 任务队列,用来储存等待执行任务的队列);List<Future<Integer>> futureList = new ArrayList<>();// 提交任务给线程池for (int i = 0; i < 6; i++) {final int taskId = i;Future<Integer> future = executor.submit(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {System.out.println("Task " + taskId + " is being executed by " + Thread.currentThread().getName());Thread.sleep(2000); // 模拟任务执行时间return taskId * 2;}});futureList.add(future);}System.out.println("———————flag1———————————");// 获取线程的返回值for (Future<Integer> future : futureList) {try {int result = future.get();//get方法会阻塞,直到任务完成并返回结果System.out.println("Task result: " + result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}System.out.println("———————flag2———————————");// 关闭线程池executor.shutdown();}
}

该示例代码创建了一个自定义的 ThreadPoolExecutor,并提交了一系列的 Callable 任务。每个任务都会返回一个整数值。我们将每个任务的 Future 对象存储在一个列表中,然后使用 get 方法获取每个任务的返回值。注意,get 方法会阻塞,直到任务完成并返回结果。

输出:
在这里插入图片描述

参考:

  • https://pdai.tech/md/java/thread/java-thread-x-juc-executor-ThreadPoolExecutor.html#threadpoolexecutor%E6%BA%90%E7%A0%81%E8%AF%A6%E8%A7%A3
  • https://javaguide.cn/java/concurrent/java-concurrent-questions-03.html#%E7%BA%BF%E7%A8%8B%E6%B1%A0

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

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

相关文章

【无线点对点网络时延分析和可视化】模拟无线点对点网络中的延迟以及物理层和数据链路层之间的相互作用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

指针变量、指针常量与常量指针的区别

指针变量、指针常量与常量指针 一、指针变量 定义&#xff1a;指针变量是指存放地址的变量&#xff0c;其值是地址。 一般格式&#xff1a;基类型 指针变量名;&#xff08;int p&#xff09; 关键点&#xff1a; 1、int * 表示一种指针类型(此处指int 类型)&#xff0c;p(变量…

qt检查文件夹是否有写权限

Qt 使用如下函数能够判断路径或者文件是否可写&#xff1a; bool QFileInfo::isWritable() const 对于win10系统实测&#xff0c;结果不准确。继续排查&#xff0c;官方文档描述&#xff1a;a&#xff09;如果未启用 NTFS 权限检查&#xff0c;Windows 上的结果将仅反映文件是…

作业2222

1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 默认yum源已配置 先关闭防火墙和selinux mount /dev/sr0 /mnt 安装http服务 yum install httpd 编写配置文件 vim /etc/httpd/conf.d/vhosts.conf 创建对应的资源文件 mkdir /www/openlab -p echo ‘welcom…

Win解答 | 解决键盘中 字母+空格 导致的输入法弹窗导致的一系列问题

近三个月来&#xff0c;一直都有一个键盘组合键的问题影响我的电脑使用&#xff0c;不管是打字还是打游戏&#xff0c;都会出现按键盘的 字母空格 弹出一个特殊符号的候选框&#xff0c;如下图所示 图片中为 S空格 所出现的弹窗 一个看似方便&#xff0c;实则难受的功能 其实打…

序列化协议:JSON和XML

作者&#xff1a;CARROT 链接&#xff1a;https://www.zhihu.com/question/604811576/answer/3100483698 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 json和xml都是数据传输的格式。比如我们开发过程中需要和网…

SpringBoot入门篇2 - 配置文件格式、多环境开发、配置文件分类

目录 1.配置文件格式&#xff08;3种&#xff09; 例&#xff1a;修改服务器端口。&#xff08;3种&#xff09; src/main/resources/application.properties server.port80 src/main/resources/application.yml&#xff08;主要用这种&#xff09; server:port: 80 src/m…

Go 1.21新增的 cmp 包详解

Go 1.21新增的 cmp 包提供了与比较有序值相关的类型和函数&#xff0c;前几篇文章讲解的 slices 包中的函数有大量使用到 cmp 包中的函数和类型。 cmp.Compare 函数 定义如下&#xff1a; func Compare[T Ordered](x, y T) int 返回值有以下几种情况&#xff1a; 如果 x 小…

MybatisPlus简单到入门

一、MybatisPlus简介 1、入门案例&#xff08;重点&#xff09;&#xff1a; 1.SpringBoot整合MP1).创建新模块选择&#xff0c;Spring项初始化。2).选择当前模块使用的技术&#xff0c;只保留MySQL Driver就行&#xff0c;不要选择mybatis避免与后面导入mybatisPlus的依赖发…

[Go版]算法通关村第十四关白银——堆高效解决的经典问题(在数组找第K大的元素、堆排序、合并K个排序链表)

目录 题目&#xff1a;在数组中找第K大的元素解法1&#xff1a;维护长度为k的最小堆&#xff0c;遍历n-k个元素&#xff0c;逐一和堆顶值对比后&#xff0c;和堆顶交换&#xff0c;最后返回堆顶复杂度&#xff1a;时间复杂度 O ( k ( n − k ) l o g k ) O(k(n-k)logk) O(k(n−…

CSS实现内凹圆角,从而实现圆角边框

1、代码 <!DOCTYPE html> <html><head><style>.uu {position: relative;width: 400px;height: 300px;}img {width: 100%;height: 100%;z-index: 1;}.box_right_top {background-image: radial-gradient(circle at left bottom, transparent 50px, whi…

统信OS国产操作系统身份证读卡器社保卡读卡web网页开发使用操作流程

用于DONSEE系列身份证阅读器谷歌Chrome火狐Firefox插件&#xff0c;支持的型号有&#xff1a;EST-100、EST-100GS、EST-100G、EST-100U、EST-200G、EST-J13X等。 本方案无缝支持最新版本谷歌Chrome火狐Firefox等网页浏览器&#xff0c;支持H5、Vue、React、Node.js、Electron、…

【面向对象编程的三大特征:封装;继承;多态】

面向对象编程的三大特征&#xff1a;封装&#xff1b;继承&#xff1b;多态 前言&#xff1a; 最近在B站搜到韩顺平老师的java入门课&#xff0c;这里记录下实践&#xff1b; 熟悉&&掌握面向对象三大特征&#xff1a;封装&#xff1b;继承&#xff1b;多态; 多态是基…

设计模式--单例模式(Singleton Pattern)

一、什么是单例模式 单例模式是一种创建型设计模式&#xff0c;它旨在确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。换句话说&#xff0c;单例模式限制了类的实例化次数为一个&#xff0c;并提供一种在应用程序中共享一个实例的方式。这对于需要只有…

Linux系统编程:线程控制

目录 一. 线程的创建 1.1 pthread_create函数 1.2 线程id的本质 二. 多线程中的异常和程序替换 2.1 多线程程序异常 2.2 多线程中的程序替换 三. 线程等待 四. 线程的终止和分离 4.1 线程函数return 4.2 线程取消 pthread_cancel 4.3 线程退出 pthread_exit 4.4 线程…

Day44|leetcode 518.零钱兑换II、377. 组合总和 Ⅳ

完全背包理论基础 视频链接&#xff1a;带你学透完全背包问题&#xff01; 和 01背包有什么差别&#xff1f;遍历顺序上有什么讲究&#xff1f;_哔哩哔哩_bilibili 完全背包与01背包不同的地方就是&#xff1a;01背包每种物品只能取一次&#xff0c;而完全背包每种物品可以取…

2023年国赛数学建模思路 - 案例:粒子群算法

文章目录 1 什么是粒子群算法&#xff1f;2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法&#xff1f; 粒子群算法&#xff08;Pa…

yolov5中添加ShuffleAttention注意力机制

ShuffleAttention注意力机制简介 关于ShuffleAttention注意力机制的原理这里不再详细解释.论文参考如下链接here   yolov5中添加注意力机制 注意力机制分为接收通道数和不接受通道数两种。这次属于接受通道数注意力机制,这种注意力机制由于有通道数要求,所示我们添加的时候…

学习JAVA打卡第四十四天

Scanner类 ⑴Scanner对象 scanner对象可以解析字符序列中的单词。 例如&#xff1a;对于string对象NBA 为了解析出NBA的字符序列中的单词&#xff0c;可以如下构造一个scanner对象。 将正则表达式作为分隔标记&#xff0c;即让scanner对象在解析操作时把与正则表达式匹配的字…

【Linux】多线程概念线程控制

文章目录 多线程概念Linux下进程和线程的关系pid本质上是轻量级进程id&#xff0c;换句话说&#xff0c;就是线程IDLinux内核是如何创建一个线程的线程的共享和独有线程的优缺点 线程控制POSIX线程库线程创建线程终止线程等待线程分离 多线程概念 Linux下进程和线程的关系 在…