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

线程池的一些问题

核心线程数1.最大线程5.队列5.存活时间10s

1.场景一

如果核心线程数.被一直占用得不到释放.新进来1个任务.会怎么样?

答: 会在队列中中死等. 只要进来的任务.不超过队列的长度,就会一直挡在队列中死等


package com.lin;import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.LinkedBlockingQueue;/*** @author lin*/
public class ThreadPoolExample {public static void main(String[] args) {// 创建线程池ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1,                        // 核心线程数5,                        // 最大线程数1,                        // 空闲线程存活时间TimeUnit.MINUTES,         // 存活时间的单位new LinkedBlockingQueue<Runnable>(6)  // 任务队列);// 提交第一个永不释放的任务给线程池threadPoolExecutor.execute(() -> {try {System.out.println("Task 1 is running and will never complete");while (true) {// 模拟一个永不释放的任务Thread.sleep(1000);}} catch (InterruptedException e) {System.out.println("Task 1 was interrupted");Thread.currentThread().interrupt();}});// 等待一段时间然后提交第二个任务try {System.out.println("等待2秒");Thread.sleep(2000); // 等待2秒,确保第一个任务已开始执行} catch (InterruptedException e) {e.printStackTrace();}for (int i = 0; i < 6; i++) {   //模拟任务数量int finalI = i;threadPoolExecutor.execute(() -> {try {System.out.println("Task "+ finalI +"is running");Thread.sleep(1000); // 模拟任务运行System.out.println("Task "+ finalI +"is completed");} catch (InterruptedException e) {e.printStackTrace();}});}// 打印线程池状态new Thread(() -> {while (true) {try {System.out.println("Active Threads: " + threadPoolExecutor.getActiveCount());System.out.println("Pool Size: " + threadPoolExecutor.getPoolSize());System.out.println("Queue Size: " + threadPoolExecutor.getQueue().size());Thread.sleep(5000); // 每5秒打印一次线程池状态} catch (InterruptedException e) {Thread.currentThread().interrupt();break;}}}).start();// 等待足够的时间观察线程池状态//try {//    Thread.sleep(60000); // 主线程等待60秒//} catch (InterruptedException e) {//    e.printStackTrace();//}// 关闭线程池//threadPoolExecutor.shutdownNow();//try {//    // 等待所有任务完成//    if (!threadPoolExecutor.awaitTermination(60, TimeUnit.SECONDS)) {//        threadPoolExecutor.shutdownNow();//    }//} catch (InterruptedException e) {//    threadPoolExecutor.shutdownNow();//}}
}

在这里插入图片描述

2.场景二

如果核心线程数,一直被占用.来了6个任务.效果会怎么样

答: 这是任务总数超过了队列的长度.线程池会创建新的线程来处理这个任务.根据队列的不同.消费任务的顺序不一样.以LinkedBlockingQueue.1,2,3,4,5添加到队列中.第6个任务来了.会创建线程先消费. 然后再又这个线程来处理1,2,3,4,5来处理.

然后处理完.空闲线程等待存活时间.然后被回收.线程池恢复到最开始的时候.

在这里插入图片描述
在这里插入图片描述

3.场景三

如果核心线程数和最大线程数的其他线程同时空置了,最大线程数的其他线程还没有被回收.现在队列中的任务,会被那个消费

答: 会优先被核心线程先消费

http://www.lryc.cn/news/350568.html

相关文章:

  • 企业或者个体户为什么会经营异常?
  • ROS从入门到精通4-3:制作Docker镜像文件Dockerfile
  • 【CV】计算机视觉是什么?
  • 如何在Vue中实现鼠标悬浮展示与隐藏弹窗的功能
  • 03 Linux编程-进程
  • Hbuild-X运行ios基座app
  • Node.js基础:从入门到实战
  • 考研408笔记总结~
  • 使用在线工具等方式下载推特视频
  • 性能优化:几方面考虑
  • 学习大数据:论学习Spark的重要性
  • 学习java第七十一天
  • Altium Designer PCB快捷键设置
  • 玩转Matlab-Simscape(初级)- 08 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(案例实战)
  • vue嵌套路由
  • 视频降噪算法 hqdn3d 原理分析
  • Ansys Mechanical|屈曲分析技术
  • 【大模型微调】一文掌握7种大模型微调的方法
  • MySQL表突然卡死,删、查操作加载不停解决办法
  • Rust 标准库的结构及其模块路径
  • 003_PyCharm的安装与使用
  • 事件传递机制
  • DE2-115串口通信
  • Danfoss丹佛斯S90泵比例放大器
  • 对话YashanDB CTO陈志标:如何推动国产数据库长远发展
  • ip显示地址和实际地址不一样:原因解析与应对策略
  • visual studio snippet常用注释片段
  • ubuntu下不生成core dumped
  • python开发的学习路线
  • vite+vue3 部署后,总是需要清除缓存的问题