创建一个自定义线程池,要求如下

初始核心线程10,最大线程数30
阻塞队列,最大深度50个
自定义线程名称为:TestThread-xxx(xxx为流水号)
如果执行任务超过maxmumPoolSize+workQueue之和时,直接使用调用线程运行此任务

https://www.cnblogs.com/nele/p/6502750.html

图片说明

代码如下

public static void main(String[] args) {
        class Test implements Runnable{
            private int i;
            private long ts;

            public Test(int i,long ts) {
                this.i = i;
                this.ts=ts;
            }

            @Override
            public void run() {
                try {
                    Thread.sleep(ts);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }

        ThreadPoolExecutor executor=new ThreadPoolExecutor(
                //初始核心线程
                10,
                //最大线程
                30,
                //允许线程闲置时间
                30,
                //允许线程闲置时间单位
                TimeUnit.SECONDS,
                //允许最大阻塞任务
                new ArrayBlockingQueue<>(50),
                //当阻塞任务达到队列长度+最大线程数量时候执行的处理策略(如下是由调用者执行)
                new ThreadPoolExecutor.CallerRunsPolicy()
        );

        for(int i=1;i<=80;i++){
            executor.execute(new Test(i,1000));
        }
        for(int i=81;i<=90;i++){
            executor.execute(new Test(i,50));
        }
        executor.shutdown();

    }