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 197(Sponsored by Panasonic) Person Editorial
A - Rotate 先输出第二和第三个字符,然后再输出第一个字符即可 B - Visibility 以 \((x,y)\) 作为起点向4个方向探索不是 # 的点,注意一下会在\((x,y)\)重复计 ...
- JSONObject--- JSON---与bean对象的转换
1.对象PO转json-string: String json = JSON.toJSONString(customerBueventAccountPO); 1.可能用到的jar宝: json-li ...
- vue+iviews 动态表格(table组件)
iviews官网上关于table的使用方法是固定表头的使用方法,如何生成动态的table网上找了好多也没有特别合适的,综合几位博主的文章经过尝试终于实现了,分享出来供大家参考 一.先看官网上的样例 官 ...
- js md5 和java md5后的值不一样
开发发现js 对字符串md5 和 java对字符串md5 计算的结果居然不一样,后来找了一个匹配的这里记录一下 注:加密的对象中不能有空格,有空格md5后的结果就不一致,都是眼泪.. js md5算法 ...
- BOM概述
- poj 3268 最短路
***题意:在x这个点有个聚会,其他的点要到x这个点,然后再会自己原始的点,求一来一回最大的那个距离 做法:两边dijstra算法,因为是单向图,要注意更新顺序*** #include<iost ...
- 大数相加 a+b
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #i ...
- java进阶(1)--final、常量
final是java的关键字,主要表示最终的 一.final修饰的类无法被继承
- json 解析:marshal 和 unmarshal
Go 使用 encoding/json 包的 marshal 和 unmarshal 实现 json 数据的编解码.分别记录如下: 1. marshal 定义结构体: type OCP struct ...
- kafka Linux环境搭建安装及命令创建队列生产消费消息
本文为博主原创,未经允许不得转载: 1. 安装JDK 由于Kafka是用Scala语言开发的,运行在JVM上,因此在安装Kafka之前需要先安装JDK. yum install java‐1.8.0‐ ...