1.背景:

由于jvm自带的线程池其中的阻塞队列大部分是使用LinkedBlockedQueue队列实现,而这个类的实现可能是不加限制的;所以当所做的项目足够的大时;可能会产生OOM;所以就比较有必要的使用自定义的线程池;;

2:使用线程池运行任务不会主动停止,需要使用shutdown()方法完成停止;

最后:(线程池的源码):

alt

3:自定义线程池:

package com.ydlclass.thread;

import com.ydlclass.lock.ThreadUtil;

import java.util.concurrent.*;

public class CustomizeThreadPool {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        //自带的jvm线程池;可以参考源码的方法实现一个自己的线程池,自定义核心线程数,最大线程数,以及阻塞队列使用有界的;
        ExecutorService myexecutorService = new ThreadPoolExecutor(5, 10,
                60L, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(50),
                //Executors.defaultThreadFactory(),//这里的线程工厂可以参考源码中的方式实现,未来会自定一个线程工厂;这是一个静态内部类;
                new myThreadFactory(),
                (r,executor) ->{
                    System.out.println("这个线程我处理不了了!");
                }
                // new ThreadPoolExecutor.AbortPolicy()
        );
        //自定义的一个线程池:这个线程池的各个参数是我们自己想要的一些参数;
        //此处的拒绝策略可以使用箭头函数实现,观察他的源码是一个接口,这个接口主要传入了一个接口和一个线程的执行器;
        for (int i = 0; i < 6000; i++) {
            myexecutorService.submit(() -> {

                System.out.println("自定义的线程池可以运行了!");
            });
        }
        //注意这个地方的线程数一旦过大会抛出一个异常,这个异常的出现原因在于,同一时间任务过多,但是线程池最大才支持10+50,=60个任务;

        //拒绝策略可以和线程工厂的方式一样,自定义一个处理方法;

        myexecutorService.shutdown();

    }
}