线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
说明: Executors 返回的线程池对象的弊端如下:
- FixedThreadPool 和 SingleThreadPool : 允许的请求队列长度为 Integer.MAX_VALUE ,可能会堆积大量的请求,从而导致 OOM 。
- CachedThreadPool 和 ScheduledThreadPool : 允许的创建线程数量为 Integer.MAX_VALUE ,可能会创建大量的线程,从而导致 OOM 。
package com.yf.test.demo;
import java.util.concurrent.*;
public class CallableDemo {
public static void main(String[] args) {
ThreadPoolExecutor pool=
new ThreadPoolExecutor(1,1,100,TimeUnit.MINUTES,new LinkedBlockingDeque<Runnable>(10));
Callable<String> callable=new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("线程开始执行。。。");
return "this return";
}
};
Future future=pool.submit(callable);
try {
System.out.println("线程执行完毕。。。");
System.out.println(future.get());
}catch (Exception e){
e.printStackTrace();
}
}
}