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线程池实现多任务并发执行的更多相关文章

  1. JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理

    本文记录: 1,使用ScheduledExecutorService的 scheduleAtFixedRate 方法执行周期性任务的过程,讨论了在任务周期执行过程中出现了异常,会导致周期任务失败. 2 ...

  2. 让Java线程池实现任务阻塞执行的一种可行方案

    Java的线程池一般是基于concurrent包下的ThreadPoolExecutor类实现的, 不过当我们基于spring框架开发程序时, 通常会使用其包装类ThreadPoolTaskExecu ...

  3. Java并发编程:Java线程池

    转载自:http://www.cnblogs.com/dolphin0520/p/3932921.html 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题 ...

  4. 并发编程(十二)—— Java 线程池 实现原理与源码深度解析 之 submit 方法 (二)

    在上一篇<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法.这篇文章是接着上一篇文章 ...

  5. Java并发编程系列-(6) Java线程池

    6. 线程池 6.1 基本概念 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:如果并发的请求数 ...

  6. Java并发指南12:深度解读 java 线程池设计思想及源码实现

    ​深度解读 java 线程池设计思想及源码实现 转自 https://javadoop.com/2017/09/05/java-thread-pool/hmsr=toutiao.io&utm_ ...

  7. 并发编程系列:Java线程池的使用方式,核心运行原理、以及注意事项

    并发编程系列: 高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 线程池的缘由 java中为了提高并发度,可以使用多线程共同执行,但是如果有大量线程短时间之内被创建和销毁,会占用大量的 ...

  8. 捕获Java线程池执行任务抛出的异常

    捕获Java线程池执行任务抛出的异常Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常, public interface Runnable { publi ...

  9. java 线程池 并行 执行

    https://github.com/donaldlee2008/JerryMultiThread/blob/master/src/com/jerry/threadpool/ThreadPoolTes ...

  10. 并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)

    史上最清晰的线程池源码分析 鼎鼎大名的线程池.不需要多说!!!!! 这篇博客深入分析 Java 中线程池的实现. 总览 下图是 java 线程池几个相关类的继承结构:    先简单说说这个继承结构,E ...

随机推荐

  1. 正泰电力携手图扑:VR 变电站事故追忆反演

    VR(Virtual Reality,虚拟现实)技术作为近年来快速发展的一项新技术,具有广泛的应用前景,支持融合人工智能.机器学习.大数据等技术,实现更加智能化.个性化的应用.在电力能源领域,VR 技 ...

  2. Redis无法使用ip访问

    问题:    启动redis服务,可以使用127.0.0.1配置并使用访问redis,但是换成IP地址就无法访问 127.0.0.1 可以 [root]#  ./redis-cli -c -h 127 ...

  3. paddlespeech asr脚本demo

    概述 paddlespeech是百度飞桨平台的开源工具包,主要用于语音和音频的分析处理,其中包含多个可选模型,提供语音识别.语音合成.说话人验证.关键词识别.音频分类和语音翻译等功能. 本文介绍利用p ...

  4. SpringCloud对使用者透明的数据同步组件

    一.背景 云端使用Spring Cloud实现,A服务有一些数据,B和C服务也需要A服务的这些数据,但是系统上面只有A服务有数据操作的入口,B和C服务只能从A服务处同步数据到自己的表里面. 解决方案是 ...

  5. 【rt-thread】驱动文件调用stm32官方驱动库关系图

    示例 drv_usart.c 调用 stm32f4xx_hal_uart.h

  6. 海思Hi35xx 实现本地和远程升级程序的方法

    前言 嵌入式linux设备要进行软件升级有很种多方式方法,总的来说可以分为本地升级和远程升级. 本地升级包括升级工具升级,存储介质升级等,远程升级是指通过网络进行程序升级. 这里介绍一种同时至此本地和 ...

  7. [转帖]性能优化:Swap调优

    目标:解决大量Log写入占用大量的File Cache,内容利用不充分导致swap 基本原则:尽量使用内存,减少swap,同时,尽早flush到外存,早点释放内存给写cache使用.---特别在持续的 ...

  8. [转帖]如何通过dba_hist_active_sess_history分析数据库历史性能问题

    https://www.cnblogs.com/DataArt/p/10018932.html 在数据库运行的过程中,我们有时会碰到数据库hung住的问题,在这个时候很多人会选择尽快让它恢复正常而不是 ...

  9. [转帖]JSR223控件简介

    JSR223控件简介 1.调用内置函数 2.执行外部java文件 3.执行jar包 JSR223取样器允许执行JSR223脚本代码用于创建/更新所需的某些变量. 由于JSR223脚本编译方式基本相同, ...

  10. [转帖]jmeter_采样器sampler简介

    1.取样器介绍 取样器是用来模拟用户操作的,向服务器发送请求以及接收服务器的响应数据. 取样器是在线程组内部的元件,也就是说取样器只能在线程组中添加. 取样器(Sampler)是性能测试中向服务器发送 ...