Executors有一个静态方法,该方法可以对现有的ExecutorService进行包装,使其只暴露出ExecutorService的方法,因此不能对其进行配置,如果我们需要创建不可更改的线程池,可以使用这个方法:
Executors.unconfigurableExecutorService(executorService);//不可配置的线程池
Executors.unconfigurableScheduledExecutorService(scheduledExecutorService);//不可配置的调度线程池
示例代码:
package com.springcloud.server.springserver.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
public class ExecutorsDemo {
public static void main(String[] args) {
//可以自动扩容的线程池
ExecutorService service = Executors.newCachedThreadPool();
ThreadPoolExecutor executorService = (ThreadPoolExecutor) service;
executorService.setCorePoolSize(10);
//执行策略无法修改
ExecutorService unExecutorService = Executors.unconfigurableExecutorService(executorService);
ThreadPoolExecutor executorService1 = (ThreadPoolExecutor) unExecutorService;
executorService1.setCorePoolSize(10);
}
}
运行:
Exception in thread "main" java.lang.ClassCastException: java.util.concurrent.Executors$DelegatedExecutorService cannot be cast to java.util.concurrent.ThreadPoolExecutor
at com.springcloud.server.springserver.thread.ExecutorsDemo.main(ExecutorsDemo.java:15)
Disconnected from the target VM, address: '127.0.0.1:50306', transport: 'socket'
错误原因:
public static ExecutorService unconfigurableExecutorService(ExecutorService executor) {
if (executor == null)
throw new NullPointerException();
return new DelegatedExecutorService(executor);
}
这个方法使用装饰者模式,将我们传入的ExecutorService包装成了Executors的一个静态内部类,并且砍掉了更改执行策略之类的一部分方法,所以我们使用这个工厂方法后无法更改此ExecutorService的执行策略.