newSingleThreadExecutor():只有一个线程的线程池,任务是顺序执行,适用于一个一个任务执行的场景
newCachedThreadPool():线程池里有很多线程需要同时执行,60s内复用,适用执行很多短期异步的小程序或者负载较轻的服务
newFixedThreadPool():拥有固定线程数的线程池,如果没有任务执行,那么线程会一直等待,适用执行长期的任务。
newScheduledThreadPool():用来调度即将执行的任务的线程池
newWorkStealingPool():底层采用forkjoin的Deque,采用独立的任务队列可以减少竞争同时加快任务处理
因为以上方式都存在弊端:
FixedThreadPool 和 SingleThreadExecutor :允许请求的队列⻓度为 Integer.MAX_VALUE,会导致OOM。
CachedThreadPool 和 ScheduledThreadPool :允许创建的线程数量为 Integer.MAX_VALUE,会导致OOM。
手动创建的线程池底层使用的是ArrayBlockingQueue可以防止OOM。