首页 > 其他分享 >线程池的执行流程

线程池的执行流程

时间:2024-07-18 15:54:44浏览次数:16  
标签:10 队列 流程 任务 线程 池会 执行

线程池的执行流程是一个系统且有序的过程,它主要涉及到任务的提交、线程的分配、任务的执行以及线程的回收等多个环节。以下是对线程池执行流程的详细阐述:

一、任务提交

  1. 提交任务:当一个新的线程任务被提交到线程池时,线程池会首先尝试在线程池中分配一个空闲线程来执行这个任务。

二、线程分配与任务执行

  1. 检查空闲线程
    • 如果线程池中存在空闲线程,则直接分配一个空闲线程来执行新任务。
    • 如果线程池中没有空闲线程,则进入下一步判断。
  2. 判断核心线程数
    • 线程池会检查当前“存活线程数”是否小于核心线程数(corePoolSize)。
      • 如果小于核心线程数,则线程池会创建一个新的核心线程来执行新任务。
      • 如果不小于核心线程数,则进入下一步判断。
  3. 检查工作队列
    • 线程池会检查工作队列(BlockingQueue)是否已满。
      • 如果工作队列未满,则将新任务放入工作队列中等待,直到有空闲线程取出并执行。
      • 如果工作队列已满,则进入下一步判断。
  4. 判断最大线程数
    • 线程池会检查当前“存活线程数”是否小于最大线程数(maximumPoolSize)。
      • 如果小于最大线程数,则线程池会创建一个新的非核心线程来执行新任务。
      • 如果不小于最大线程数,则进入拒绝策略环节。
  5. 也就是说,如果当前核心线程数是10,最大线程数是20,工作队列长度为10,当有30个任务过来时,会先执行1-10个任务,再执行第21-30个任务,然后才是第11-20,可以由以下代码进行验证
    public class CustomPool {
        public static void main(String[] args) {
            //自定义线程池
            ExecutorService threadPool = new ThreadPoolExecutor(
                    10,
                    20,
                    0L,
                    TimeUnit.SECONDS,
                    new ArrayBlockingQueue<Runnable>(10),
                    Executors.defaultThreadFactory(),
                    new ThreadPoolExecutor.AbortPolicy()
            );
            class MyTask implements Runnable {
                int i = 0;
                public MyTask(int i){
                    this.i = i;
                }
    
                @Override
                public void run() {
                    try {
                        System.out.println(Thread.currentThread().getName() + "做第" + i + "个项目");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            try {
                for (int i = 1; i <= 100;i++){
                    MyTask task = new MyTask(i);
                    threadPool.execute(task);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                threadPool.shutdown();
            }
        }
    }
    

三、拒绝策略

  • 当工作队列已满,且当前线程数已达到最大线程数时,如果再有新任务提交到线程池,则会触发拒绝策略。拒绝策略可以是以下几种之一(根据JDK实现):
    • AbortPolicy:直接抛出RejectedExecutionException异常,阻止系统正常运行。
    • CallerRunsPolicy:用调用者所在的线程来执行任务,即不会在线程池中创建新线程,也不会丢弃任务。
    • DiscardPolicy:不处理新任务,直接丢弃掉。
    • DiscardOldestPolicy:丢弃队列中最老的一个任务,然后尝试再次提交当前任务。
    • 自定义拒绝策略:实现RejectedExecutionHandler接口,自定义处理逻辑。

标签:10,队列,流程,任务,线程,池会,执行
From: https://blog.csdn.net/Airtiesy/article/details/140525358

相关文章

  • 过滤器(Filter)和拦截器(Interceptor)的执行顺序和区别
    https://www.cnblogs.com/kuotian/p/13176186.html过滤器FilterFilter有如下几个用处。Filter有如下几个种类。javax.servlet.Filter接口1.通过@WebFilter注解配置2.通过@Bean来配置3.SpringMVC在web.xml配置过滤器启动测试拦截器InterceptorHandlerIn......
  • Java中的并发数据结构与多线程优化技术
    Java中的并发数据结构与多线程优化技术大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在多线程编程中,并发数据结构和优化技术是提高系统性能和可靠性的关键。Java提供了丰富的并发数据结构和多线程优化技术,本文将详细介绍常用的并发数据结构及其使用方法......
  • MySQL如何优雅的执行DDL
    一、前言关于MySQLDDL表结构变更,各个工单平台基本上都支持了pt-osc及OnlineDDL的方式,但是,我相信仍然有一大部分人,不太了解这两种方式各自的优缺点是啥,以至于实际当中,会稀里糊涂的随机选一种去执行,选对了固然好,选错了,自然免不了领导的一顿K,这......当然是开玩笑的哈。 在各......
  • 阿里云网站备案流程
    域名icp备案按步骤依次进行 公安联网备案申请地址:https://beian.mps.gov.cn填写网站信息需要域名证书阿里云注册信息详见文档https://help.aliyun.com/zh/icp-filing/basic-icp-service/user-guide/the-public-security-network-for-the-record-information-fill-in-t......
  • java创建线程池的几中方式
    1.创建线程池四种方式使用Executors类,Executors类是Java中用于创建线程池的工厂类,它提供了多种静态方法来创建不同类型的线程池使用ThreadPoolExecutor类,ThreadPoolExecutor是Java中线程池的一个核心类,它提供了更细粒度的控制来创建和管理线程池使用Future和......
  • 能把进程和线程讲的这么透彻的,没有20年功夫还真不行【0基础也能看懂】
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......
  • 【科研绘图】【多因子分组箱线图】:附Origin详细画图流程
    目录1、理解箱线图2、画图流程1、理解箱线图(1)什么是箱线图箱线图,又称箱形图、盒须图或盒式图,用于体现数据分散情况的统计图。在视觉上辅助读者直观地看到每个数据中心位置、散布范围以及异常值等信息。(2)箱线图的组成箱体:下图方框形状的位置即为箱体,箱体下侧边界......
  • iOS开发基础132-POSIX线程库
    POSIX线程库,通常称为Pthreads(POSIXThreads),是一个基于POSIX标准的多线程编程接口。它为多线程应用程序提供了一组标准化的API,兼容多个UNIX系统,包括Linux、macOS等。POSIX线程库概览POSIX线程库主要包括以下几个组成部分:线程管理:创建和操作线程。线程同步:互斥锁(mut......
  • 内存、存储中(计算机、MCU)的引导流程、存储器
    内存、存储中(计算机、MCU)的引导流程、存储器一、内存栈区(stack):存放非静态局部变量堆区(heap):存放malloc()、calloc()、realloc()、free()等函数动态分配的数据 ——malloc()-C语言标准库中的函数全局静态区:存放静态局部变量、全局变量代码区:存放程序代码栈......
  • 从头理清uboot(2)-启动流程分析
    从头理清uboot(2)-启动流程分析目录从头理清uboot(2)-启动流程分析1.总体流程图2.逐步分析2.1上电后执行的第一条指令2.2初始化中断向量表2.3初始化工作模式&初始化中断向量表。2.4cpu_init_cp15&cpu_init_crit2.4.1cpu_init_cp152.4.1cpu_init_crit2.5进入_main函数2.5......