首页 > 其他分享 >线程池excute方法执行流程

线程池excute方法执行流程

时间:2023-07-09 18:34:24浏览次数:36  
标签:excute 队列 流程 任务 添加 command ctl 线程

 1 //    线程池execute方法执行流程
 2     public void execute(Runnable command) {
 3 //        非空判断,判断提交的任务是否为空
 4         if (command == null)
 5             throw new NullPointerException();
 6 //        获取ctl属性
 7         int c = ctl.get();
 8 //        工作线程个数是否小于核心线程数
 9         if (workerCountOf(c) < corePoolSize) {
10 //            添加一个核心线程
11             if (addWorker(command, true))
12 //                添加核心线程成功,返回true,直接return结束
13                 return;
14 //            如果在并发情况下,添加核心线程失败的线程,需要重新获取一次ctl属性
15             c = ctl.get();
16         }
17 //        创建核心线程失败
18 //        判断当前线程池状态是否为running
19 //        如果是RUNNING,执行offer方法将任务添加到工作队列
20         if (isRunning(c) && workQueue.offer(command)) {
21 //            添加任务到工作队列成功
22 //            再次获取ctl
23             int recheck = ctl.get();
24 //            线程池是否为RUNNING状态,如果不是RUNNING状态,需要将任务从工作队列移除
25             if (! isRunning(recheck) && remove(command))
26 //                线程池状态不正确,执行拒绝策略
27                 reject(command);
28 //            是RUNNING状态,判断工作线程是否为0
29             else if (workerCountOf(recheck) == 0)
30 //                工作线程数为0,但是工作队列中有任务在排队
31 //                添加一个空任务非核心线程,为了处理在工作队列中排队的任务
32 //                线程为SHUTDOWN的时候,需要工作线程数为0并且工作队列为空才能转换成过渡状态,最后才能销毁线程
33 //                我们创建一个任务为空的非核心线程去执行工作队列中还没处理的任务,才能保证线程状态切换不出现问题。
34                 addWorker(null, false);
35         }
36 //        任务添加到工作队列失败,尝试创建非核心线程去执行当前任务
37         else if (!addWorker(command, false))
38 //            添加非核心线程失败,会执行reject拒绝策略
39             reject(command);
40     }

 

标签:excute,队列,流程,任务,添加,command,ctl,线程
From: https://www.cnblogs.com/zhang12345/p/17539126.html

相关文章

  • 线程创建
    三种创建方式Threadclass继承Thread类Runnable接口实现Runnable接口Callable接口实现Callable接口Thread自定义线程类继承Thread类重写run()方法,编写线程执行体创建线程对象,调用start()方法启动线程//创建线程方式一:继承Thread类,重写run()......
  • 06、etcd 写请求执行流程
    本篇内容主要来源于自己学习的视频,如有侵权,请联系删除,谢谢。上一节我们学习了etcd读请求执行流程,这一节,我们来学习etcd写请求执行流程。1、etcd写请求概览etcd一个写请求执行流程又是怎样的呢?etcdctl put hello world ‐‐endpoints 192.168.65.210:2379执行流程......
  • Visio如何绘制技术路线图、方法流程图?
      本文介绍基于Visio软件绘制技术路线图、流程图、工作步骤图等的方法。  首先打开Visio。我们可以直接选择“基本框图”进行绘制。  也可以选用一些模板。  本次我们就以“流程图”为例来绘制。  因为要绘制论文的技术路线图,因此各种形状简约即可,我们就选择“基......
  • SpringBoot 集成异步线程调用
    步骤:1、在自动审核的方法上加上@Async注解(标明要异步调用)2、在文章发布成功后调用审核的方法3、在自媒体引导类中使用@EnableAsync注解开启异步调用 ......
  • [Raspberry Pi]树莓派多线程下串口收发数据
    [RaspberryPi]树莓派多线程下串口收发数据鼠鼠用的是python开发树莓派,因为python是最优美的语言!少废话,直接上代码:importthreadingimportserialimportcv2ser=serial.Serial("/dev/ttyAMA0",115200)ser.timeout=5ifnotser.isOpen:ser.open()#打开串口......
  • Spring中的Controller和Service是线程安全的吗?我有点懵
    结论:不是线程安全的Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。Spring的bean作用域(scope)类型singleton:单例,默认作用域。prototype:原型,每次创......
  • 多线程part2-多线程的两个概念
    并发同一时刻,有多个指令在单个CPU上交替执行理解:打游戏的时候,右手操作鼠标,同时用右手喝可乐,手速特别快交替执行,这时,你的右手相当于CPU,执行的对象相当于线程并行同一时刻,有多个指令在多个CPU上同时执行理解:关键点在于同时 ......
  • 多线程
    importtime,threadingfromthreadingimportLockdefwork(timer):#如果在函数内部找不到变量,就会向上寻找,main函数属于向上的领域withlock:print('操作文件')print('只要在withlock里,就是单线程')print(f'线程名称名:{threading......
  • 如何实现获取spring boot线程池中的所有线程的具体操作步骤
    获取SpringBoot线程池中的所有线程作为一名经验丰富的开发者,我将向你介绍如何获取SpringBoot线程池中的所有线程。这将帮助你更好地了解线程池的工作原理,并能在开发过程中更好地监控和管理线程。整体流程下面是整个过程的步骤概览:步骤描述1获取SpringBoot应用上下......
  • C++之在线程间切分任务
    背景在多线程编程中,如何有效地在多个线程间切分任务是一个关键问题。合理地切分任务可以充分发挥多核处理器的性能,提高程序的运行效率。本文将介绍在线程间切分任务的原理和实践,包括任务切分策略、负载均衡、任务同步等方面的内容。任务切分策略在多线程编程中,我们需要根据实际......