您当前的位置: 首页 > 双眼皮

Java中线程池你真的会用吗?

2018-11-07 11:04:00
"可以通过Executors静态工厂构建线程池,但一般不建议这样使用。

"关于这个问题,作者之所以这么说,是因为这种创建线程池的方式有很大的隐患,稍有不慎就有可能导致线上故障。

本文我们就来围绕这个问题来分析一下为什么JDK自身提供的构建线程池的方式并不建议使用?到底应该如何创建一个线程池呢?ExecutorsExecutors 是一个Java中的工具类。

提供工厂方法来创建不同类型的线程池。

从上图中也可以看出,Executors的创建线程池的方法,创建出来的线程池都实现了ExecutorService接口。

常用方法有以下几个:newFiexedThreadPool(int Threads):创建固定数目线程的线程池。

newCachedThreadPool:创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。

如果没有可用的线程,则创建一个新线程并添加到池中。

终止并从缓存中移除那些已有 60 秒钟未被使用的线程。

newSingleThreadExecutor创建一个单线程化的Executor。

newScheduledThreadPool(int corePoolSize)创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

类看起来功能还是比较强大的,又用到了工厂模式、又有比较强的扩展性,重要的是用起来还比较方便,如:ExecutorService executor = Executors.newFixedThreadPool(nThreads) ;即可创建一个固定大小的线程池。

但是为什么我说不建议大家使用这个类来创建线程池呢?我提到的是『不建议』,但是在阿里巴巴Java开发手册中也明确指出,而且用的词是『不允许』使用Executors创建线程池。

Executors存在什么问题在阿里巴巴Java开发手册中提到,使用Executors创建线程池可能会导致OOM(OutOfMemory ,内存溢出),但是并没有说明为什么,那么接下来我们就来看一下到底为什么不允许使用Executors?我们先来一个简单的例子,模拟一下使用Executors导致OOM的情况。

通过指定JVM参数:-Xmx8m -Xms8m 运行以上代码,会抛出OOM:以上代码指出,ExecutorsDemo.java的第16行,就是代码中的executor.ex
javascript学习
android的软件测试
html教程

推荐阅读
图文聚焦