1.背景:
由于jvm自带的线程池其中的阻塞队列大部分是使用LinkedBlockedQueue队列实现,而这个类的实现可能是不加限制的;所以当所做的项目足够的大时;可能会产生OOM;所以就比较有必要的使用自定义的线程池;;
2:使用线程池运行任务不会主动停止,需要使用shutdown()方法完成停止;
最后:(线程池的源码):
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();
}
}