线程池的原理,线程池的工作机制以及线程池的拒绝策略在前面的文章已经很完整的写清楚,但是对于实际开发怎么选择呢?
在阿里巴巴java开发手册这样写道:
Executors实现几种创建线程池方式如上图,考虑线程的性能当然要考虑线程池的存储底层结构,LinkedBlockingQueue是一个无界阻塞队列,只不过他的存储长度为Integer的最大21亿左右。
当有大量的并发时,队列会产生大量的线程,从而导致服务器扛不住,OOM。
我们创建线程可以使用下面的方式
ThreadPoolExecutor executor = new ThreadPoolExecutor(2,
5,
1L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
队列长度根据需要自己设置,线程工厂使用默认的即可。拒绝策略根据具体场景在做具体选择。