使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?

简介: 使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?

今天开会同事说使用线程池,当提交的子线程超过运行的最大线程数,会阻塞主线程,然后我就回复 有拒绝策略,会抛出异常,同时也要确认当线程池满的时候executor.execute方法会不会是阻塞的了,其实内心是不认可这个观点的。不轻信别人,谨慎求证,直接上测试代码

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolTest {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(5));
        long a = 0;
        for(int i=0;i<500;i++){
            MyTask myTask = new MyTask(i);
            try{
                a= System.currentTimeMillis();
                executor.execute(myTask);
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                long b = System.currentTimeMillis()-a;
                System.out.println("线程提交时间间隔"+b);
            }
        }
        executor.shutdown();
    }
   static class MyTask implements Runnable {
        private int taskNum;
        public MyTask(int num) {
            this.taskNum = num;
        }
        @Override
        public void run() {
            System.out.println("正在执行task "+taskNum);
            try {
                Thread.currentThread().sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("task "+taskNum+"执行完毕");
        }
    }
}

上述代码配置线程运行最大线程数量是10,启动500个线程,测试当线程池满的情况下,根据领导的说法,会阻塞,因此我就在 executor.execute(myTask); 前后加上开始时间和结束时间,看看他们的执行时间,到底是多少。最后测试结果如下:


image.png

出现了很多线程被拒绝的异常,但是大部分情况都是0毫秒。所以阻塞主线程的说法是错误的。


相关文章
|
5月前
|
监控 Java 调度
Java线程池ThreadPoolExecutor初略探索
Java线程池ThreadPoolExecutor初略探索
|
6月前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
160 5
|
6月前
|
数据采集 Java Python
python并发编程: Python好用的线程池ThreadPoolExecutor
python并发编程: Python好用的线程池ThreadPoolExecutor
123 2
python并发编程: Python好用的线程池ThreadPoolExecutor
|
5月前
|
监控 安全 Java
深入理解Java线程池:ThreadPoolExecutor
深入理解Java线程池:ThreadPoolExecutor
68 0
|
3月前
|
监控 Java
ThreadPoolExecutor 线程执行超时,释放线程
ThreadPoolExecutor 线程执行超时,释放线程
156 1
【多线程面试题十二】、阻塞线程的方式有哪些?
线程阻塞的方式包括调用sleep()方法、阻塞式IO操作、等待同步监视器的获取、等待通知(notify),以及慎用的suspend()方法。
【多线程面试题十一】、如何实现子线程先执行,主线程再执行?
要实现子线程先执行,主线程再执行,可以在启动子线程后立即调用其join()方法,使主线程等待子线程执行完成。
|
5月前
|
前端开发 JavaScript
JavaScript异步处理避免了单线程阻塞,如回调函数、Promise和async/await。
【6月更文挑战第22天】JavaScript异步处理避免了单线程阻塞,如回调函数、Promise和async/await。回调是基础,用于在操作完成后执行函数;Promise管理异步状态,支持链式调用;async/await提供同步代码外观,简化错误处理。每种技术在处理耗时任务时都起着关键作用。
48 3
|
5月前
|
Java
【技术解码】Java线程的五味人生:新建、就绪、运行、阻塞与死亡的哲学解读!
【6月更文挑战第19天】Java线程生命周期如同人生旅程,经历新建、就绪、运行、阻塞至死亡五阶段。从`new Thread()`的诞生到`start()`的蓄势待发,再到`run()`的全力以赴,线程在代码中奔跑。阻塞时面临挑战,等待资源释放,最终通过`join()`或中断结束生命。线程的每个状态转变,都是编程世界与哲思的交汇点。
39 1
|
6月前
|
设计模式 安全 Java
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)