阿里巴巴强制不让使用Executors创建,使用ThreadPoolExecutor创建。Executors返回线程池对象弊端如下:
FixedThreadPool和SingleThreadExecutor:允许请求队列最大长度为Integer.MAX_VALUE,导致OOM;CachedThreadPool和ScheduledThreadPool:允许创建线程的最大数量为Integer.MAX_VALUE,导致OOM。
并发库中有个类是BlockingQueue,就是阻塞队列,这个类提供了两个方法,put()和take(),前者是将对象放到队列里,如果没有空闲节点了,就等待,后者是从头拿对象,如果没有对象了就等到有。FixedThreadPool和SingleThreadExecutor都是采用无界的LinkedBlockingQueue,LinkedBlockingQueue中引入了两把锁,takeLock和putLock,分别用于take和put操作,因为入队和出队用的不同的锁,所以这个队列可以同时入队和出兑。
线程池对队列的三种状态:无界队列、有界队列、同步移交。
无界队列:请求无限增加,队列也会无限增加,会导致资源耗尽。