自定义线程池的深入理解

如果对于自定义线程池类以及其中的参数不了解,可以查看我的一篇关于常见三种线程池的讲解

  1. 自定义线程池的代码展示

    public class ThreadPoolDemo {
    
        public static void main(String[] args) {
    
            ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10,20,
                    0L, TimeUnit.MILLISECONDS,
                    new ArrayBlockingQueue<Runnable>(10)
            );
            
            for (int i = 0; i < 100; i++) {
                threadPoolExecutor.execute(new MyTask(i));
            }
            
        }
    
    }
    
    class MyTask implements Runnable{
    
        int i = 0;
        public MyTask(int i) {
            this.i = i;
        }
    
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+"--"+i);
            try {
                Thread.sleep(1000L); //业务逻辑
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    }
    

    这是一个自定义的线程池,其中设定的核心线程为10,非核心线程也是10,对列是一个数组队列,队列长度也是10,看上面这段代码,猜一下会报什么错。

  2. 报错错误展示

    错误如下图所示:
    在这里插入图片描述
    这是因为任务有100个,而队列加上线程的长度只有30个,所以剩下的任务会被拒绝掉。猜一下该线程池中任务的打印顺序又是什么

  3. 任务打印顺序

    打印顺序如下图:
    在这里插入图片描述
    可以看到先跑完了任务20-29,后面再跑的任务10-19,那为什么是这个顺序呢

  4. 任务打印顺序原理

    根据下图进行讲解
    在这里插入图片描述
    线程的
    提交优先级

    当多个任务在线程池中分配时,首先会到核心线程那里去,当核心进程满了,接着到队列中去,当队列中满了,再到非核心进程中去。

    执行优先级

    核心线程会先执行任务,接着是非核心线程在执行任务,队列是当核心线程和非核心线程都执行完成后,才会被执行到。

    所以,才会出现先任务11-20最后被执行。

猜你喜欢

转载自blog.csdn.net/PhilsphyPrgram/article/details/118073090