java线程池实现多任务并发执行
Java线程池实现多任务并发执行
1️⃣ 创建一些任务来落地多任务并发执行
每一个数组里面的数据可以看成任务,或者是需要并发的业务接口,
数组与数组之间,可以看作为他们之间有血缘关系,简单来说就是:
taskJksj里面的10个任务执行完之后,才可以执行taskJxdx里面的4个任务,执行完taskJxdx之后,才可以执行taskNbzz里面的2个任务

2️⃣ 创建线程池
要将taskJksj、taskJxdx、taskNbzz这几个数组中里面定义的任务通过线程池并发执行

3️⃣ ThreadPoolExecutor源码分析以及为什么不用newFixedThreadPool()和newCachedThreadPool()
1.首先为什么不用newFixedThreadPool()和newCachedThreadPool()

点进去查看这两个方法的源码



2.为什么用ThreadPoolExecutor创建
通过上面两个例子就能看到,这俩方法很不靠谱,如果你不明白他的原理,看到项目上以前创建线程的代码就是这样的,你想都不想就copy过来,那后面绝对就是在给自己挖坑;
通过发现这俩方法,他们都是return new ThreadPoolExecutor(),所以真正的大佬其实是ThreadPoolExecutor,他俩只是调用了ThreadPoolExecutor而已。

核心线程数:初始定义的线程数量,是绝对会开启的固定的线程数量
最大线程数:当前线程池支持的最大线程数量,如果超过了这个数量那么肯定就报错了
阻塞队列 :当前进来线程池的线程大于核心线程数且小于最大线程数,那么就把当前线程池的线程-核心线程数的线程放在阻塞队列里,让他等着假如核心线程数 2 个,最大线程数5个,阻塞队列长度 3,当前进来了4个线程,那么就将 4 - 2 = 2 个线程放在阻塞队列里面,让他先等待
默认工厂 :当前进来线程池的线程大于最大线程数且小于(最大线程数+阻塞队列长度),那么就需要开放剩下的三个线程通道,让另外的3个线程通道进行工作,核心线程数 2 个,最大线程数5个, 阻塞队列长度3,当前进来了8个,可以看到进来了8个线程,已经满足了最大线程和阻塞队列长度之和了,简单理解就是现在进来的线程把目前这个线程池所有能利用的空间都占满了,只有 2个线程工作不够,需要把另外的3个(5 - 2)赶快放开让他们也工作,这个打开另外三个线程的这个工作就需要工厂来做,让工厂把这三个线程打开
拒绝策略 :当进入线程池的线程过多,远远超过了最大线程数+阻塞队列,那么就需要拒绝这些即将要进入线程池的线程。
等待时间:在等待时间段中,当线程池里面的线程都执行的差不多了,又回到了"进来线程池的线程大于核心线程数且小于最大线程数"时,就没有必要把5个线程通道全部打开,浪费资源,所以就把其 他的三个线程关掉,留2个核心的就行
等待时间单位:单位,时分秒
4️⃣ 执行任务


为三个任务编写对应的执行多线程方法,写法都是一样的,重复copy即可,最后执行的效果就是

import java.util.concurrent.*; /**
* @Author : YuanXin
* @create 2024/2/1 11:11
* @Description :
*/
public class Main {
public static void main(String[] args) { taskListImpl taskList = new taskListImpl(); String taskJksj = taskList.poolExecutorJksj(); String taskJxdx = null; if (taskJksj.equals("taskJksjSuccess")) { taskJxdx = taskList.poolExecutorJxdx(); } if (taskJxdx.equals("taskJxdxSuccess")) { taskList.poolExecutorNbzz(); } }
} class taskListImpl { // 创建一些任务
int[] taskJksj = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; int[] taskJxdx = new int[]{15, 16, 17, 18}; int[] taskNbzz = new int[]{101, 102}; public String poolExecutorJksj() { ThreadPoolExecutor pool =
new ThreadPoolExecutor(
3,
10,
3,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(5),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()
); // ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
// ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); try {
for (int i = 0; i < taskJksj.length; i++) { int num = i; pool.execute(() -> { taskJksjPool(num); }); }
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
pool.shutdown();
} return "taskJksjSuccess"; } public void taskJksjPool(int num) { System.out.println(Thread.currentThread().getName() + " " + taskJksj[num]); } public String poolExecutorJxdx() { ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 10, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(5), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); try {
for (int i = 0; i < taskJxdx.length; i++) { int num = i; pool.execute(() -> { taskJxdxPool(num); }); }
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
pool.shutdown();
} return "taskJxdxSuccess"; } public void taskJxdxPool(int num) { System.out.println(Thread.currentThread().getName() + " " + taskJxdx[num]); } public String poolExecutorNbzz() { ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 10, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(5), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); try {
for (int i = 0; i < taskNbzz.length; i++) { int num = i; pool.execute(() -> { taskNbzzPool(num); }); }
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
pool.shutdown();
} return "taskNbzzSuccess"; } public void taskNbzzPool(int num) { System.out.println(Thread.currentThread().getName() + " " + taskNbzz[num]); } }
java线程池实现多任务并发执行的更多相关文章
- JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理
本文记录: 1,使用ScheduledExecutorService的 scheduleAtFixedRate 方法执行周期性任务的过程,讨论了在任务周期执行过程中出现了异常,会导致周期任务失败. 2 ...
- 让Java线程池实现任务阻塞执行的一种可行方案
Java的线程池一般是基于concurrent包下的ThreadPoolExecutor类实现的, 不过当我们基于spring框架开发程序时, 通常会使用其包装类ThreadPoolTaskExecu ...
- Java并发编程:Java线程池
转载自:http://www.cnblogs.com/dolphin0520/p/3932921.html 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题 ...
- 并发编程(十二)—— Java 线程池 实现原理与源码深度解析 之 submit 方法 (二)
在上一篇<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法.这篇文章是接着上一篇文章 ...
- Java并发编程系列-(6) Java线程池
6. 线程池 6.1 基本概念 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:如果并发的请求数 ...
- Java并发指南12:深度解读 java 线程池设计思想及源码实现
深度解读 java 线程池设计思想及源码实现 转自 https://javadoop.com/2017/09/05/java-thread-pool/hmsr=toutiao.io&utm_ ...
- 并发编程系列:Java线程池的使用方式,核心运行原理、以及注意事项
并发编程系列: 高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 线程池的缘由 java中为了提高并发度,可以使用多线程共同执行,但是如果有大量线程短时间之内被创建和销毁,会占用大量的 ...
- 捕获Java线程池执行任务抛出的异常
捕获Java线程池执行任务抛出的异常Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常, public interface Runnable { publi ...
- java 线程池 并行 执行
https://github.com/donaldlee2008/JerryMultiThread/blob/master/src/com/jerry/threadpool/ThreadPoolTes ...
- 并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)
史上最清晰的线程池源码分析 鼎鼎大名的线程池.不需要多说!!!!! 这篇博客深入分析 Java 中线程池的实现. 总览 下图是 java 线程池几个相关类的继承结构: 先简单说说这个继承结构,E ...
随机推荐
- AtCoder Beginner Contest 215 (个人题解 A~F)
比赛链接:Here AB水题, C - One More aab aba baa 题意: 给出字符串 \(s\) 和整数 \(k\) ,请输出字典序第 \(k\) 大的原字符串 \(s\) 的排序 思 ...
- 领域驱动设计(DDD)实践之路(四):领域驱动在微服务设计中的应用
这是"领域驱动设计实践之路"系列的第四篇文章,从单体架构的弊端引入微服务,结合领域驱动的概念介绍了如何做微服务划分.设计领域模型并展示了整体的微服务化的系统架构设计.结合分层架构. ...
- 【驱动】SPI驱动分析(二)-SPI驱动框架
SPI驱动框架 SPI驱动属于总线-设备-驱动模型的,与I2C总线设备驱动模型相比,大体框架是一样,他们都是实际的总线.总体框架如下图所示: 从上到下,分为三层,用户空间,内核空间,和硬件层. 用户空 ...
- ThreadLocal应用及理解
转载请注明出处: 1. 先展示threadLocal的一个简单封装,该封装用来在不同的请求线程中解析用户参数.在请求经过过滤器时, 对用户的信息进行设置入 ThreadLocalContext 中,可 ...
- APB Slave Design
APB Slave Design module apb_slave #( REG1_ADDR = 8'h00, REG2_ADDR = 8'h04, REG3_ADDR = 8'h08 ) ( // ...
- 05-Shell索引数组变量
1.介绍 Shell 支持数组(Array),数组是若干数据的集合,其中的每一份数据都称为数组的元素. 注意Bash Shell 只支持一维数组,不支持多维数组. 2.数组的定义 2.1 语法 在 S ...
- 【linux】虚拟机 ubuntu 使用 sudo apt-get install 安装软件出现 “Unable to locate package xxx ”解决方法
使用 sudo apt-get install 安装软件出现如下错误 上述错误表示找不到软件源,可更改软件源服务器解决 还有工具链 arm-none-eabi-gcc 实际安装的是 sudo apt ...
- JavaScript - input 上传图片 并展示 (食用简单)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- [转帖]SQLServer的UTF8支持
排序规则和 Unicode 支持 - SQL Server | Microsoft Learn UTF-8 支持 SQL Server 2019 (15.x) 完全支持广泛使用的 UTF-8 字符编码 ...
- [转帖]谨慎调整内核参数:vm.min_free_kbytes
https://www.cnblogs.com/muahao/p/8082997.html 内核参数:内存相关 内存管理从三个层次管理内存,分别是node, zone ,page; 64位的x86物理 ...