线程池中非核心线程何时创建

本文为博客 VIP 文章,开通 VIP 后可阅读全文

开通 VIP

线程池中非核心线程何时创建,先说结论:任务队列满了,才会创建非核心线程。

public class ThreadPoolVerify {
    public static void main(String[] args){
        int taskIndex = 0;
        BlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<>(20);

        ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,
                30, TimeUnit.SECONDS, blockingQueue, new ThreadPoolExecutor.CallerRunsPolicy());
        while (taskIndex<50){
            System.out.println(String.format("当前任务队列任务数量:%d", executor.getQueue().size()));
            executor.execute(new Task(taskIndex));
            taskIndex++;
        }
        executor.shutdown();
    }
}
class Task implements Runnable {
    private int taskIndex=0;

    public Task(int taskIndex) {
        this.taskIndex = taskIndex;
    }

    [@Override](https://my.oschina.net/u/1162528)
    public void run() {
        try {
            System.out.println(String.format("线程名称:%s, 处理第%d个任务。",
                    Thread.currentThread().
测试JAVA线程池核心数满了后什么时候开始创建新的线程 文章目录环境测试代码输出结果 只要是Java面试,基本上线程池是没跑了。但是有个点总是卡在那里,不是很清楚,就是核心线程池数满了,没到最大线程数的时候。到底什么时候开始建线程呢,本文就从代码结果层面来测试一下。 首先,我们来创建了一个线程池,设置核心数5个,最大线程数10个,任务队列10个,alive时间是2s,每个任务就是随机的sleep一会,主要用来占用时间。 创建线程后,每隔一秒钟,获取一下线程池的状态。 根据输出发现,当任务数大于5个后,active数依然没变,只要任务数为16个的时候,activ 阅读详情

相关推荐

Executors线程池创建方式及线程核心参数配置

系列文章目录 文章目录系列文章目录前言一、Executors常用的线程池类型二、线程池中队列常用类型三、线程池原理、以及核心参数四、线程池的拒绝策略五、java实现创建线程池总结 前言 为什么要用线程池,因为“池”的思想就是以空间换时间,就像数据库连接池一样,好处就是:1、降低资源消耗。通过重复利用已创建线程降低线程创建和销毁造成的消耗。2线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 提示:以下是本篇文章正文内容,下面案例可供参

zhx__的博客 5281

线程池详解:线程池七大核心参数、线程池工作原理、线程池创建方式、线程池的拒绝策略、如何合理分配线程池大小

线程池是一种用于管理和复用线程的机制,它允许我们在需要执行一些并发任务时,可以重复使用已经创建好的线程,而不是每次都创建新的线程。这样可以减少线程创建和销毁的开销,提高系统的性能和响应速度。并发线程池的优点包括: 提高系统的性能和吞吐量,因为可以重复使用已经创建好的线程,减少线程创建和销毁的开销。 可以控制并发任务的执行顺序和数量,从而避免系统资源被过度占用。 可以设置线程池的参数,如核心线程数、最大线程数、任务队列等,以满足不同场景的需求。

小小鱼儿小小林的博客 1万+

线程池--线程池核心参数、执行原理、常见的阻塞队列、核心线程数的确定、线程池的种类、不建议用Executors创建线程池的原因

线程池--线程池核心参数、执行原理、常见的阻塞队列、核心线程数的确定、线程池的种类、不建议用Executors创建线程池的原因

qq_17158265的博客 1070

线程池核心线程是如何保持住的?

通过对线程池的学习,我们知道了线程池的执行流程:1、任务到来时,看CORE线程数有没有满,如果没有满则新创建线程处理。2、如果core线程数量满了,则放入队列中。3、如果队列也满了,则看看线程数量是否达到了maxPoolSize值,如果没有则创建线程处理。4、如果已经达到了maxPoolSize的值,则根据拒绝策略处理任务。然后我们可以回答这些问题:1、核心线程池是如何保持住的?通过workQueue.take()方法对线程进行阻塞,让我们线程保持住不被数量-1而回收掉。

GAMELOFT9----纸上得来终觉浅,绝知此事要躬行 3854

线程池非核心线程是什么时候创建的?

当任务队列中的任务数量超出了核心线程数,但是线程池的总线程数(包括核心线程非核心线程)还没有达到最大线程数时,线程池创建额外的非核心线程来处理任务。总的来说,线程池非核心线程是在任务队列中的任务数量超出了核心线程数,并且任务队列已满时动态创建的,以应对任务量的变化和保持线程池的性能和效率。在任务队列中的任务数量出现波动或突然增加时,线程池非核心线程会根据情况动态地创建和销毁,以适应任务量的变化,并保持线程池的适度扩展和收缩。

m0_63102097的博客 760

java线程池杂谈(线程池创建和运行)

继之前写过阿里编码规约对线程池创建,关于线程池还想再写写自己的理解。1、为啥要有线程池2、线程池怎么创建3、线程池是怎么运行的4、Executors创建线程的弊端下面来一一说一下自己的理解(有说的不对的还请同学不吝赐教)

高山仰止,景行行止 1785

非核心线程数啥时候启用?

线程池的参数是什么可以说是当面试官准备问你线程池相关问题的时候一个必问的知识点了, 非核心线程数什么时候启用? 就是在基本参数问完还想深入问的话,又一个常问的问题 其实并不难 非核心线程数什么时候启用呢?我们可以通过下面这个面试题来理解一下: 假设我们设置的线程池参数为:corePoolSize=10, maximumPoolSize=20,queueSize = 10 20个并发任务过来,有多少个活跃线程? 10个。corePoolSize打满,queueSize 也满 21个并发任务过来,有多少个活跃线

自救 唯有自强 656

Java 并发编程】线程池机制 ( 线程池执行任务细节分析 | 线程池执行 execute 源码分析 | 先创建核心线程 | 再放入阻塞队列 | 最后创建非核心线程 )

一、线程池执行任务细节分析、 二、线程池执行 execute 源码分析、先创建核心线程 | 再放入阻塞队列 | 最后创建非核心线程

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1764

线程池核心线程、等待队列、非核心线程创建时机

线程池核心线程、等待队列、非核心线程创建时机 创建入下线程池核心线程数为2,最大活动线程数为10,缓存队列长度为2。 private static ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 10, 1000L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2), new ThreadFactory() { @Override

weixin_42934146的博客 3869

Java线程池中的核心线程是如何被重复利用的?

Java线程池中的核心线程是如何被重复利用的?引言在Java开发中,经常需要创建线程去执行一些任务,实现起来也非常方便,但如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。此时,我们很自然会想到使用线程池来解决这个问题。使用线程池的好处: 降低资源消耗。java中所有的池化技术都有一个好处,就是通过复用

MingHuang2017的博客 9921

使用线程池创建线程

1.如何使用线程池创建线程java中提供了一个静态工厂方法来创建不同的线程池:  Executors 通过静态方法创建出的线程都实现了ExecutorService接口。常用的方法包括: newFixedThreadPool(int threads); 创建一个固定数目的线程池 newCachedThreadPool(); 创建一个可缓存的线程池,调用execute方法将重用以前...

csdn_wangchen的博客 1万+

java线程池?,线程池有哪些创建方式?,线程池参数?,线程池的队列有哪些?,线程池的拒绝策略?,线程池的执行流程或原理?为什么禁止用Executor来创建线程池

都知道在java中有线程,但是创建一个线程需要上下文切换,线程其实是非常消耗性能的,线程池能帮助开发者创建线程,提高开发效率,能控制线程的数量。:通过线程池,可以避免频繁地创建和销毁线程,从而减少了线程创建和上下文切换的开销,提高了系统的性能和效率。:线程池可以限制同时执行的线程数量,通过设置线程池的大小和队列容量,可以控制系统的并发度,防止因过多的线程导致系统资源耗尽或性能下降。:线程池可以统一管理和调度线程的生命周期,包括创建、执行和销毁线程等操作。

pangHu很菜 2万+

Java 线程池的缺陷

一.缺陷 1.非核心线程创建时机 1.1) 核心线程的数量是corePoolSize 的值,非核心线程的数量是 maxinumPoolSize -corePoolSize ; 1.2) 非核心线程创建的触发时机是:当前线程池核心线程已满,且没有空闲的线程,还有任务等待队列已满, 满足上面的所有条件,才会去创建线程去执行新提交的任务; ...

lihongtai的专栏 3551

线程池非核心线程创建原因

线程池中的队列任务满了才会创建非核心线程执行任务。

qq_34975787的博客 302

线程池为何要构建空任务的非核心线程

这涉及到线程池中的任务队列策略。有界队列是指队列有一定的容量限制,当任务数超过队列容量时,如果核心线程数还未满,则会创建新的核心线程去执行任务,否则新的任务会被拒绝执行。但是,如果在极端情况下,任务数一直很少,只有很少的任务需要被执行,而大量的非核心线程处于空闲状态,这会导致大量的资源浪费。它的作用是在任务队列中插入一些空任务,这样即使没有实际的任务需要执行,非核心线程也能够被唤醒并执行这些空任务,以保持线程池中的线程数目和资源利用率的平衡。核心线程线程池中最基本的线程,它们会一直存在直到线程池关闭。

我是Java程序员廖志伟,感谢朋友们的支持! 659

通过自定义阻塞队列触发ThreadPoolExecutor创建非核心线程执行任务

Java项目常使用ThreadPoolExecutor创建线程池核心参数包含corePoolSize,maximumPoolSize,workQueue。我们希望构建的线程池能满足如下条件: 线程数量可控。需要设置一个最大线程数量maximumPoolSize,防止线程无限制创建,耗尽系统资源。 放到线程池中的任务不会被拒绝丢弃(任务被丢弃,将导致严重的业务BUG)。所以一般定义一个无界阻塞队列(不指定大小,容量最大值是Integer.MAX_VALUE),用于缓存待执行的任务。 无界队列导致maxi

Neo.Yang的专栏 1188

7000字+24张图带你彻底弄懂线程池

大家好,我是三友。今天跟大家聊一聊无论是在工作中常用还是在面试中常问的线程池,通过画图的方式来彻底弄懂线程池的工作原理,以及在实际项目中该如何自定义适合业务的线程池。 一、什么是线程池 线程池其实是一种池化的技术的实现,池化技术的核心思想其实就是实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销。在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行销毁,而是继续去处理其它线程已经提交的任务。 使用线程池的好处 降低资源消耗。通过重复利用已创建线程降低线程创建和销毁造成的消耗..

weixin_45630885的博客 889

Java线程池为什么添加空任务分配给非核心线程

如果只有非空任务才会被分配给非核心线程,那么在任务队列中可能会积累大量的空任务,导致非核心线程一直处于空闲状态,而核心线程却忙于执行非空任务。即使是空任务,也可能会被分配给非核心线程来执行。即使是空任务,也可以使线程池保持活跃状态,以便在有实际任务到来时能够立即分配线程进行执行,而不需要额外的线程创建开销。通过让非核心线程执行空任务,可以使线程池中的线程得到更好的复用,减少频繁地创建和销毁线程的开销。总的来说,为了保持任务处理的公平性、快速响应时间和线程的复用性,线程池会将空任务也分配给非核心线程执行。

学亮编程手记 984
上一篇: 十三 cookies
程序虫OS
博客等级 码龄13年 6粉丝 92原创
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值