一个实例理解线程池工作原理 曾经终败给现在 2022-06-06 06:15 196阅读 0赞 线程池初始化成功之后,当任务提交上来,线程池中的线程是如何构建的。 下面给出构建线程池的三个重要参数: 核心线程数:corePoolSize 最大线程数:maximumPoolSize 队列大小:workQueueSize 线程池中的线程,开始是没有的,当任务提交上来之后,会开始创建,当达到核心线程数之后,进入队列,如果队列已经满了,那么开始创建新的线程,直到达到最大线程数,这时候,如果没有线程执行完成,还有新的任务加入进来,那么线程池会开启拒绝策略。 下面通过一段代码来演示这个原理。我们假定核心线程数是5,队列大小5,最大线程数是10。这里我们假定任务数是15个,那么正好模拟这个不出现异常的线程池工作场景。 package com.xxx.threadpool; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolDemo { public static void main(String[] args) { int corePoolSize = 5; int maximumPoolSize = 10; long keepAliveTime = 200; TimeUnit unit = TimeUnit.MILLISECONDS; ArrayBlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(5); ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); for(int i=0;i<15;i++){ executor.execute(new MyThread(i)); System.out.println("线程池中线程数目:"+executor.getPoolSize()+ ",队列中等待执行的任务数目:"+executor.getQueue().size()+ ",已经执行完的别的任务数目:"+executor.getCompletedTaskCount()); } executor.shutdown(); } } class MyThread implements Runnable{ private int taskNum; public MyThread(int taskNum) { this.taskNum = taskNum; } @Override public void run() { System.out.println("正在执行任务 "+taskNum); try { Thread.sleep(4000); } catch (Exception e) { e.printStackTrace(); } System.out.println("任务 "+taskNum+" 执行完毕。"); } } 执行这段代码打印信息如下: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaW5pZmk_size_16_color_FFFFFF_t_70][] 这里我们设置的线程任务总数刚好是15=maximumPoolSize(10)+workQueueSize(5)。所以程序没有出现异常, 我们如果设置的线程任务数大于15,那么线程池会开启拒绝策略,如下打印信息: Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.xxx.threadpool.MyThread@6bc7c054 rejected from java.util.concurrent.ThreadPoolExecutor@232204a1\[Running, pool size = 10, active threads = 10, queued tasks = 5, completed tasks = 0\] at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047) at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823) at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369) at com.xxx.threadpool.ThreadPoolDemo.main(ThreadPoolDemo.java:19) 到此为止,我们通过实例演示了线程池线程创建的过程,加深了我们对线程池的理解和认识。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaW5pZmk_size_16_color_FFFFFF_t_70]: /images/20220606/6ff50a7bfe304ece8981ba2730f9249e.png
相关 理解Java中的线程池工作原理及问题 Java中的线程池是一种资源管理模式,它通过预创建一定数量的线程,并将这些线程保存在队列中。当有新的任务提交时,线程池会根据任务的数量和优先级来选择合适的线程来处理任务。 线 素颜马尾好姑娘i/ 2024年09月11日 09:03/ 0 赞/ 9 阅读
相关 线程池的底层工作原理 线程池的好处 降低资源消耗:通过重复利用已经创建的线程降低线程创建和销毁造成的消耗; 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能执行; 骑猪看日落/ 2022年11月22日 12:50/ 0 赞/ 125 阅读
相关 线程池工作原理 Java线程池主要用于管理线程组及其运行状态,以便Java虚拟机更好的利用CPU资源。Java线程池的工作原理为:JVM先根据用户给定的参数创建一定数量的可运行的线程任务,并将 ╰+哭是因爲堅強的太久メ/ 2022年11月13日 04:26/ 0 赞/ 221 阅读
相关 线程池的工作原理 我们在工作中或多或少都使用过线程池。但是为什么要使用线程池呢?从它的名称中我们就可以猜到,线程池是使用了一种池化技术(Pooling Technology)。和很多其他池化技术 灰太狼/ 2022年11月01日 05:21/ 0 赞/ 187 阅读
相关 一个实例理解线程池工作原理 线程池初始化成功之后,当任务提交上来,线程池中的线程是如何构建的。 下面给出构建线程池的三个重要参数: 核心线程数:corePoolSize 最大线程数:maximum 曾经终败给现在/ 2022年06月06日 06:15/ 0 赞/ 197 阅读
相关 理解线程池的原理 读完本文你将了解: 什么是线程池 线程池的处理流程 保存待执行任务的阻塞队列 创建自己的线程池 JDK 提供的线程池及使用场景 清疚/ 2022年05月30日 05:50/ 0 赞/ 150 阅读
相关 理解线程池的原理 读完本文你将了解: [什么是线程池][Link 1] [线程池的处理流程][Link 2] [保存待执行任务的阻塞队列][Link 3] [创建自己的 小灰灰/ 2022年05月22日 22:55/ 0 赞/ 187 阅读
相关 理解线程池的原理 1.关于线程池 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Ja 比眉伴天荒/ 2022年05月15日 06:40/ 0 赞/ 202 阅读
相关 浅谈线程池的工作原理 jdk1.5引入了concurrent包,包中增加了线程池的概念。 关于线程池的工作原理,作者在execute做了注释。 ![在这里插入图片描述][watermark_ 喜欢ヅ旅行/ 2022年01月11日 05:33/ 0 赞/ 308 阅读
还没有评论,来说两句吧...