Java中线程池的简单使用

最新做项目使用到了多线程,很自然就想到了用线程池。

Java中通过Executors来使用线程池,简单介绍下以下两种线程池的使用:

  • FixedThreadPool

1
ExecutorService threadPool = Executors.newFixedThreadPool(threadCount);

固定线程数量的线程池。创建线程池时立即创建threadCount个线程,当线程池已满时新加入的任务处于排队等待状态。

固定线程池适合一些对资源有限制的多线程场合,比如网络请求多张图片等,常用配置是将threadCount设置为当前CPU核数。

  • CachedThreadPool

1
ExecutorService threadPool = Executors.newCachedThreadPool();

缓存线程池。创建时并不会预先创建线程,当有任务加入时动态新建线程;任务运行结束后线程并不会马上被销毁,而是被线程池缓存起来,当又有新任务加入时重用被缓存的线程,减少反复创建新线程的开销;当缓存的线程长时间不被使用(比如60秒),将会被线程池销毁。

缓存线程池适合对资源需求伸缩性较大的场合,比如服务器后台处理来自客户端的请求时。

注意:
  • 线程池建议使用静态方式创建,即程序整个生命周期中都只使用这一个线程池;
  • 如果一定要使用动态的,在线程池使用结束后,一定记得调用shutdown()释放,线程池对象被CG时不会自动释放已创建的线程。
EOF