自定义线程池的实践

/**
 * 自定义线程池
 */
public class UserDefinedThread {
    public static void main(String[] args) {

//使用ThreadPoolExecutor定义自己的想要的线程池
//核心线程数,最大线程数,最大空闲时间,时间单位,阻塞队列,线程工厂,拒绝策略
        ExecutorService executorService = new ThreadPoolExecutor(1, 2, 0L, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(100), new DefineThreadFactory(new ThreadGroup("测试线程组"),"测试线程"),new DefineRejectedExecutionHandler());


        for (int i = 0; i < 10; i++) {
            final  int a=i;
            executorService.submit(()->{
                System.out.println("线程"+a+"开始执行");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程"+a+"执行完毕");
            });
        }
    }

 //定义线程工厂
    static class  DefineThreadFactory implements ThreadFactory {

        public DefineThreadFactory(ThreadGroup group, String namePrefix) {
            this.group = group;
            this.namePrefix = namePrefix;
        }

        @Override
        public Thread newThread(Runnable r) {
            //线程组,runnable对象r,名字,线程编号,线程堆栈大小(0表示可以忽略该参数)
            String name=namePrefix + threadNumber.getAndIncrement();
            Thread t = new Thread(group, r,
                    name,
                    0);
            System.out.println("创建了新线程"+name);
            return t;
        }
        //当前线程池编号
        private static final AtomicInteger poolNumber = new AtomicInteger(1);

        //当前线程组
        private final ThreadGroup group;
        //当前线程编号
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        //当前线程名
        private final String namePrefix;
    }

//定义拒绝策略
    static  class  DefineRejectedExecutionHandler implements RejectedExecutionHandler{

        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            System.out.println("多余的任务被丢弃"+r.toString());
        }
    }


}



执行结果:
自定义线程池的实践

是因为自定义线程池的实践

核心线程数为1,最大线程数为2,缓存队列为100,这样的话,当创建一个线程后,就已经到达了最大线程数,剩下的任务将会进入缓存队列,不在创建新线程。