线程池-开发规范

101 阅读1分钟

image.png

import java.util.Random;

public class MyTask implements Runnable {
    @Override
    public void run() {
        Random r = new Random();
        System.out.println(Thread.currentThread().getName() + "::" + Math.abs(r.nextInt()));
        try {
            Thread.sleep(999999999);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class Demo {
    public static void main(String[] args) {
        //多态的方式创建线程池对象
        /*
            参数一: 核心线程数  不能死亡的线程                     3
            参数二: 最大线程数   要求 最大线程数>=核心线程数       5
                临时线程: 最大线程数 - 核心线程数                  2
            参数三: 临时线程最大空闲时间
            参数四: 最大空闲时间的单位
            参数五: 任务队列
            参数六: 线程工厂    线程池中的多个线程是如何创建的
            参数七: 拒绝策略   核心线程和临时线程都被占用,任务队列满了,新来的任务的处理方案
         */
        ExecutorService pool = new ThreadPoolExecutor(3,5,60, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());

        //证明3个核心线程在工作:任务队列中没有任务的,临时线程没有被创建的
        
        pool.execute(new MyTask());
        pool.execute(new MyTask());
        pool.execute(new MyTask());

        //证明3个核心线程忙着,再来新的任务进入任务队列,不会创建临时线程
        pool.execute(new MyTask());
        pool.execute(new MyTask());
        pool.execute(new MyTask());

        //证明会创建两个临时线程: 核心线程正在使用,任务队列满了,临时线程可以被创建
        pool.execute(new MyTask());
        pool.execute(new MyTask());

        //拒绝了: 核心线程正在使用,任务队列满了,临时线程使用完毕了,没有可以创建的临时线程
        pool.execute(new MyTask());

    }
}