Java线程池ThreadPoolExecutor理解(2)

变化,因此corePoolSize,和maximumPoolSize可以相等,同时它使用无界队列存放无法立即执行的任务,当任务提交非常频繁的时候,该队列可能迅速膨胀,从而耗尽

系统资源。

Executors.newSingleThreadExecutor()

public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }

返回单线程的线程池,是newFixedThreadPool()方法的一种退化,只是简单的将线程池的线程数量设置为1

Executors.newCachedThreadPool()

public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }

返回corePoolSize为0 maximumPoolSize无穷大的线程池,这意味着在没有任务时,该线程内无线程,而当任务被提交时,该线程池会使用空闲的线程执行任务,若无空闲

线程,则将任务加入SynchronousQueue队列,而SynchronousQueue队列是一种直接提交的队列,它总会迫使线程池增加新的线程执行任务,当任务执行完毕后,

由于corePoolSize为0,因此空线程又会在指定时间内(60s)被回收。

对于newCachedThreadPool(),如果同时又大量任务被提交,而任务的执行又不那么快时,那么系统便会开启等量的线程处理,这样的做法可能会很快耗尽系统的资源。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2026a8f330517733a467cdb7416dbb77.html