如何自定义线程池
//自定义线程池
public class ThreadPoolExecutorDemo {
public static void main(String[] args) {
//得到自己电脑cpu是几核的 一般maximumPoolSize默认 为自己电脑cpu为几核 +1 或者 +2
System.out.println(Runtime.getRuntime().availableProcessors());
ExecutorService threadPool = new ThreadPoolExecutor(
2,
9,
2L,
TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(),
Executors.defaultThreadFactory(),
//拒绝访问策略
/**
* new ThreadPoolExecutor.AbortPolicy() :AbortPolicy(默认)
* 直接抛出RejectedExecutionException异常阻止系统正常运行
* DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加人队列中
* 尝试再次提交当前任务。
* DiscardPolicy:该策略默默地丢弃无法处理的任务,不予任何处理也不抛出异常。
* 如果允许任务丢失,这是最好的一种策略。
*/
//CallerRunsPolicy:“调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。
new ThreadPoolExecutor.CallerRunsPolicy()
);
try{
for (int i = 1; i <=10 ; i++) {
threadPool.execute(
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"开始执行工作");
})
);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭线程池
threadPool.shutdown();
}
}
}
可以仿照底层ThreadPoolExecutor源码来进行编写