当前位置: 首页 > news >正文

Java线程池编码示例

第1步:自定义线程实现类

Java中多线程编码时,定义线程类有两种方式:

  • 继承Thread类
  • 实现Runnable接口(由于Java的单继承特性,一般推荐使用此方式)
public class BizThread implements Runnable {private int idx;public BizThread(int idx) {this.idx = idx;}@Overridepublic void run() {long threadId = Thread.currentThread().getId();System.out.println("这是第" + idx + "个线程>>>>>>>>>【线程ID-" + threadId + "】业务逻辑begin");// region 模拟业务逻辑处理过程try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}// endregionSystem.out.println("这是第" + idx + "个线程<<<<<<<<<【线程ID-" + threadId + "】业务逻辑end");}
}

第2步:使用ThreadPoolExecutor线程池启动线程

当调用线程池execute()方法添加一个任务时,线程池会做如下判断: ·

  • 如果有空闲线程,则直接执行该任务; ·
  • 如果没有空闲线程,且当前运行的线程数少于corePoolSize,则创建新的线程执行该任务; ·
  • 如果没有空闲线程,且当前的线程数等于corePoolSize,同时阻塞队列未满,则将任务入队列,而不添加新的线程; ·
  • 如果没有空闲线程,且阻塞队列已满,同时池中的线程数小于maximumPoolSize ,则创建新的线程执行任务; ·
  • 如果没有空闲线程,且阻塞队列已满,同时池中的线程数等于maximumPoolSize,则根据构造函数中的handler指定的策略来拒绝新的任务。
public class MultiThreadTest {public static void main(String[] args) {// 定义线程池ExecutorService pool = new ThreadPoolExecutor(2,9,60,TimeUnit.SECONDS,new SynchronousQueue<>(),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());// 模拟10个线程并发for (int i=1; i<=10; i++) {pool.execute(new BizThread(i));}}
}

运行结果:

这是第1个线程>>>>>>>>>【线程ID-12】业务逻辑begin
这是第5个线程>>>>>>>>>【线程ID-16】业务逻辑begin
这是第3个线程>>>>>>>>>【线程ID-14】业务逻辑begin
这是第8个线程>>>>>>>>>【线程ID-19】业务逻辑begin
这是第4个线程>>>>>>>>>【线程ID-15】业务逻辑begin
这是第2个线程>>>>>>>>>【线程ID-13】业务逻辑begin
这是第7个线程>>>>>>>>>【线程ID-18】业务逻辑begin
这是第9个线程>>>>>>>>>【线程ID-20】业务逻辑begin
这是第6个线程>>>>>>>>>【线程ID-17】业务逻辑begin
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.etoak.BizThread@14ae5a5 rejected from java.util.concurrent.ThreadPoolExecutor@7f31245a[Running, pool size = 9, active threads = 9, queued tasks = 0, completed tasks = 0]at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)at com.etoak.MultiThreadTest.main(MultiThreadTest.java:50)
这是第8个线程<<<<<<<<<【线程ID-19】业务逻辑end
这是第6个线程<<<<<<<<<【线程ID-17】业务逻辑end
这是第5个线程<<<<<<<<<【线程ID-16】业务逻辑end
这是第1个线程<<<<<<<<<【线程ID-12】业务逻辑end
这是第2个线程<<<<<<<<<【线程ID-13】业务逻辑end
这是第7个线程<<<<<<<<<【线程ID-18】业务逻辑end
这是第3个线程<<<<<<<<<【线程ID-14】业务逻辑end
这是第9个线程<<<<<<<<<【线程ID-20】业务逻辑end
这是第4个线程<<<<<<<<<【线程ID-15】业务逻辑end

ThreadPoolExecutor构造方法参数说明:

  1. corePoolSize(核心线程数量):核心线程默认会一直存活,即使没有任务需要执行
  2. maximumPoolSize(线程池最大线程数量):线程池中能拥有最大线程数
  3. keepAliveTime(空闲线程的存活时间):当线程空闲时间达到keepAliveTime时,线程会销毁,线程数量默认会收缩至corePoolSize的大小
  4. unit(时间单位):指定keepAliveTime的单位
  5. workQueue(任务队列):缓存任务的排队策略(SynchronousQueue队列,一个不缓存任务的阻塞队列,本身没有容量大小;每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态)
  6. threadFactory(创建线程工厂):默认会使用ThreadPoolExecutor.defaultThreadFactory()创建线程
  7. handler(任务拒绝策略):当workQueue已满,且线程池中的线程数达到maximumPoolSize时,线程池拒绝添加新任务时采取的策略(AbortPolicy策略:丢弃新任务,并抛出运行时异常由开发人员进行处理)

相关文章:

Java线程池编码示例

第1步&#xff1a;自定义线程实现类 Java中多线程编码时&#xff0c;定义线程类有两种方式&#xff1a; 继承Thread类实现Runnable接口&#xff08;由于Java的单继承特性&#xff0c;一般推荐使用此方式&#xff09; public class BizThread implements Runnable {private int …...

如何优化Android 4.x系统设置字体大小

android4.x系统设置字体大小导致应用布局混乱的解决方案 在前几年&#xff0c;Android系统的设置界面还是相对简单的&#xff0c;用户可以通过设置菜单进行各种系统设置&#xff0c;如字体大小、壁纸、铃声等。但是随着用户对系统功能的需求越来越多&#xff0c;Android系统也在…...

Docker安装、Docker基本操作

一、Dokcer安装 1.安装 # 1、yum 包更新到最新,需要几分钟时间(注意:也可以直接跨过) sudo yum update # 2、作用&#xff1a;安装需要的软件包&#xff0c; yum-util 提供yum-config-manager功能&#xff0c;另外两个是devicemapper驱动依赖的 sudo yum install -y yum-util…...

系统集成项目管理工程师知识点总结

项目经理的五种权利&#xff1a; 职位权力&#xff1a; 来源于管理者在组织中的职位和职权。罚权力&#xff1a; 使用降职、扣薪、惩罚、批评、威胁等负面手段的能力。奖励权力&#xff1a; 给予下属奖励的能力专家权力&#xff1a; 来源于个人的专业技能。参照&#xff08;号…...

【游戏里的网络同步分析】马里奥制造2 多人模式

前置知识 先说几个游戏设计的术语。 PlayerAgent是玩家控制的网络游戏中的角色形象&#xff0c;也是代表在游戏空间中的玩家&#xff0c;被唯一PlayerController所拥有&#xff0c;被所有用户可观测到。 在马里奥制造2中&#xff0c;PlayerAgent一共有四种&#xff1a;马里奥 …...

SSM框架学习-注解开发第三方bean管理

1. 复习xml配置文件管理第三方bean 在Spring中&#xff0c;可以使用依赖注入&#xff08;Dependency Injection&#xff09;来管理和使用第三方Bean。Spring提供了多种方式来进行依赖注入&#xff0c;比如构造函数注入、Setter方法注入、字段注入等。下面以Setter方法注入为例&…...

【数据结构与算法】图——邻接表与邻接矩阵

文章目录 一、图的基本概念二、图的存储结构2.1 邻接矩阵2.2 邻接表2.3 邻接矩阵的实现2.4 邻接表的实现 三、总结 一、图的基本概念 图&#xff08;Graph&#xff09;是由顶点的有穷非空集合和顶点之间边的集合组成&#xff0c;通常表示为&#xff1a;G&#xff08;V,E&#…...

网安笔记02 密码学基础

密码学概述 • 1.1、密码学的基本概念 密码编码学 : 密码编制 密码分析学 : 密码破译 密码学 &#xff1a; 研究密码保护 通信手段的科学&#xff0c; 密码编码学密码分析学 密码技术&#xff1a; 把可理解的消息伪装为不可理解的消息&#xff0c;再复原成原消息的科学 概…...

open3d io操作

目录 1. read_image, write_image 2. read_point_cloud, write_point_cloud 3. 深度相机IO操作 4. Mesh文件读取 1. read_image, write_image 读取jpg. png. bmp等文件 image_io.py import open3d as o3dif __name__ "__main__":img_data o3d.data.JuneauIma…...

【Linux】Linux安装Redis(图文解说详细版)

文章目录 前言第一步&#xff0c;下载安装包第二步&#xff0c;上传安装包到/opt下&#xff08;老规矩了&#xff0c;安装包在opt下&#xff09;第三步&#xff0c;解压安装包第四步&#xff0c;编译第五步&#xff0c;安装第六步&#xff0c;配置redis第七步&#xff0c;设置开…...

setTimeout不准时,CSS精准实现计时器功能

实际开发过程中&#xff0c;我们会经常遇到&#xff0c;首次进入页面进行相应提示&#xff0c;然后指定时间后自动消失或者前端时钟展示等需求。 按照传统方案&#xff0c;我们可以使用 setTimeout 实现。但其存在&#xff1a;实际延时比设定值更久的情况。 setTimeout 不准时…...

单细胞跨模态分析综述

单细胞技术的最新进展使跨模态和组织位置的细胞高通量分子分析成为可能。单细胞转录组数据现在可以通过染色质可及性、表面蛋白表达、适应性免疫受体库分析和空间信息进行补充。跨模态单细胞数据的可用性越来越高&#xff0c;推动出新的计算方法&#xff0c;以帮助科学家获得生…...

【零基础学机器学习 1】什么是机器学习?

机器学习的社会应用 1. 金融风控 机器学习在金融风控方面的应用非常广泛&#xff0c;可以用于预测借款人的信用风险、欺诈行为等。通过收集大量的历史数据&#xff0c;构建机器学习模型&#xff0c;可以对借款人的信用风险进行预测&#xff0c;从而帮助金融机构降低风险。 2…...

ARM处理器与中断——嵌入式(驱动)软开基础(一)

1 CPU的内部结构? CPU的内部结构大致可以分为: (1)控制单元(指令寄存器、指令译码器、操作控制器)。 (2)运算单元(算术逻辑单元)。 (3)存储单元(专用寄存器和通用寄存器) (4)时钟。 2 CPU跟内存、虚拟内存、硬盘的关系? (1)CPU要调用的程序和数据来自…...

WX小程序 - 2

条件渲染&#xff1a; wx:if "{{ newlist.length 0 }}" wx:else 跳路由&#xff1a;绑定点击事件&#xff0c;执行跳转页面 bindtap data-id"{{ item.id }}" 添加id wx.navigateTo 跳路由并传参&#xff0c; 下一个路由 onLoad生命周期可以获得参数…...

开源之夏2023 | 欢迎申请openEuler Embedded SIG开发任务

关于开源之夏 开源之夏是开源软件供应链点亮计划下的暑期活动&#xff0c;由中科院软件研究所与openEuler社区联合主办&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;促进优秀开源软件社区的蓬勃发展。 活动联合各大开源社区&#xff0c;针对重要开源软件…...

【异常解决】vim编辑文件时提示 Found a swap file by the name “.start.sh.swp“的解决方案

vim编辑文件时提示 Found a swap file by the name ".start.sh.swp"的解决方案 一、问题描述二、原因说明三、解决方案3.1 方案1 删除即可3.2 方案2 禁止生成swp文件 一、问题描述 vim编辑文件时提示 Found a swap file by the name “.start.sh.swp”&#xff0c;如…...

「企业应用架构」应用架构概述

在信息系统中&#xff0c;应用架构或应用架构是构成企业架构&#xff08;EA&#xff09;支柱的几个架构域之一 应用架构描述了业务中使用的应用程序的行为&#xff0c;重点是它们如何相互之间以及如何与用户交互。它关注的是应用程序消费和生成的数据&#xff0c;而不是它们的内…...

ePWM模块(3)

比较模块 CMPA:比较寄存器A,其值与TBCTR值比较,相同时,事件发送到动作模块。 CMPB:比较寄存器B,其值与TBCTR值比较,相同时,事件发送到动作模块。 CMPCTL:控制寄存器(重要) SHDWAFULL(或SHDWBFULL):CMPA(或B)阴影寄存器满标志位 0:未满 1:满了 SHDWAMODE(或…...

【笔试强训选择题】Day11.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…...

告别C盘战士!ArcGIS 10.6安装路径选择与磁盘空间优化全攻略

告别C盘战士&#xff01;ArcGIS 10.6安装路径选择与磁盘空间优化全攻略当GIS初学者第一次安装ArcGIS 10.6时&#xff0c;往往会被其庞大的安装体积所震惊。许多用户习惯性地点击"下一步"&#xff0c;结果发现C盘空间被迅速吞噬&#xff0c;系统运行变得迟缓。本文将深…...

Agent开发面试通关攻略:吃透稳拿offer

阅读前置&#xff1a;2026年当下最卷也最缺人的AI岗位&#xff0c;一定是AI Agent开发。最近刷遍CSDN、牛客、力扣最新面经&#xff0c;发现一个非常明显的招聘趋势&#xff1a;普通大模型微调岗位饱和内卷&#xff0c;而AI Agent开发岗位人才严重缺口&#xff0c;薪资更高、竞…...

Taotoken平台快速获取APIKey并开始你的第一个Python调用示例

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken平台快速获取APIKey并开始你的第一个Python调用示例 1. 准备工作&#xff1a;注册与登录 要开始使用Taotoken&#xff0c…...

XML 服务器

XML 服务器 引言 XML(可扩展标记语言)服务器在现代互联网技术中扮演着至关重要的角色。它为数据的传输和处理提供了灵活且高效的方式。本文将深入探讨XML服务器的概念、工作原理、应用场景及其在软件开发中的重要性。 什么是XML服务器? XML服务器是一种用于存储、处理和…...

如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型

如何快速上手DeepPurpose&#xff1f;5分钟完成你的第一个药物-靶点相互作用预测模型 【免费下载链接】DeepPurpose A Deep Learning Toolkit for DTI, Drug Property, PPI, DDI, Protein Function Prediction (Bioinformatics) 项目地址: https://gitcode.com/gh_mirrors/de…...

基于USB ACA模式实现安卓手机边玩边充的游戏手柄设计

1. 项目缘起&#xff1a;当手机性能过剩&#xff0c;却败给了触摸屏几年前&#xff0c;我清理手机游戏时&#xff0c;发现一个挺无奈的现象&#xff1a;性能足以媲美掌机的智能手机里&#xff0c;只剩下一些慢节奏的平台解谜或者数独。那些曾经让我在掌机上废寝忘食的赛车、动作…...

对比自行维护多个 API 源,使用 Taotoken 聚合服务在运维复杂度上的降低

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比自行维护多个 API 源&#xff0c;使用 Taotoken 聚合服务在运维复杂度上的降低 在构建依赖多个大语言模型的应用时&#xff0c…...

Adobe-GenP 3.0:轻松激活Adobe全家桶的完整指南

Adobe-GenP 3.0&#xff1a;轻松激活Adobe全家桶的完整指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款专为Adobe Creative Cloud系列软件…...

基于Max78000与规则引导的音频数据集构建:边缘AI声音识别实战

1. 项目概述&#xff1a;当边缘AI遇见棕榈树里的“窃听者”在边缘计算和物联网设备大行其道的今天&#xff0c;我们常常面临一个核心矛盾&#xff1a;一方面&#xff0c;我们希望设备足够“聪明”&#xff0c;能实时识别并响应特定的声音模式&#xff0c;比如工厂里高压阀门的异…...

基于MAX78000的边缘AI语音识别:从模型训练到嵌入式部署实战

1. 项目概述与核心思路最近在捣鼓一个挺有意思的小项目&#xff0c;我把它叫做“声控转向控制器”。简单来说&#xff0c;这玩意儿能听懂你说的几个特定单词&#xff0c;比如“左转”、“右转”、“前进”、“后退”&#xff0c;然后控制对应的LED灯亮起。你可能会想&#xff0…...