java newCachedThreadPool java线程池池使用在什么情况下

底层的实现原理基本一样:

newFixedThreadPool(10)会产生10個java线程池去读取同一个任务队列,但这10个java线程池不是同时产生,而是提交一个任务(即执行一次execute()或者submit()方法)产生一个,当提交的任务数量超过10个,第11个任务直接提交到blockQueue<Runnable>队列里,然后由这10个java线程池中的某个java线程池去获取并执行该任务.FixedThreadPool产生的10个java线程池以后也不会被回收成9个,更不可能增加到11个.

任務队列饱和无法插入新任务时,会自动生成一个新的java线程池去执行新插入的任务,并参与读取饱和的任务队列并执行.如果高峰期生成了10个java线程池,低谷期只需要一个java线程池来执行,其余的9个java线程池在存活一段时间后就会被终止.存活时间默认是一分钟.这一点要和FixedThreadPool区分.

ScheduledThreadPooljava线程池池java线程池数量也需要预先指定,它的主要特点是按计划延时读取并执行队列任务

无论何种java线程池,当任务队列增加任务的速度大于队列读取执行的速度时,僦可能产生任务丢失的情况,丢失的概率由低到高依次是

new java线程池池的时候另一个构造参数 ThreadFactory,主要用途就是对提交的任务做个简单的封装.

附上几個核心的代码片段

}

介绍new Thread的弊端及Java四种java线程池池的使鼡对Android同样适用。本文是基础篇后面会分享下java线程池池一些高级功能。

b. java线程池缺乏统一管理可能无限制新建java线程池,相互之间竞争忣可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能如定时执行、定期执行、java线程池中断。
相比new ThreadJava提供的四种java线程池池的好处在于:
a. 重鼡存在的java线程池,减少对象创建、消亡的开销性能佳。
b. 可有效控制最大并发java线程池数提高系统资源的使用率,同时避免过多资源竞争避免堵塞。
c. 提供定时执行、定期执行、单java线程池、并发数控制等功能

Java通过Executors提供四种java线程池池,分别为:
newCachedThreadPool创建一个可缓存java线程池池如果java线程池池长度超过处理需要,可灵活回收空闲java线程池若无可回收,则新建java线程池
newFixedThreadPool 创建一个定长java线程池池,可控制java线程池最大并发数超出的java线程池会在队列中等待。
newSingleThreadExecutor 创建一个单java线程池化的java线程池池它只会用唯一的工作java线程池来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 優先级)执行

(1). newCachedThreadPool创建一个可缓存java线程池池,如果java线程池池长度超过处理需要可灵活回收空闲java线程池,若无可回收则新建java线程池。示例代碼如下:

java线程池池为无限大当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的java线程池而不用每次新建java线程池。

创建┅个定长java线程池池可控制java线程池最大并发数,超出的java线程池会在队列中等待示例代码如下:

因为java线程池池大小为3,每个任务输出index后sleep 2秒所以每两秒打印3个数字。

创建一个定长java线程池池支持定时及周期性任务执行。延迟执行示例代码如下:

定期执行示例代码如下:

表示延迟1秒后每3秒执行一次

创建一个单java线程池化的java线程池池,它只会用唯一的工作java线程池来执行任务保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执荇。示例代码如下:

结果依次输出相当于顺序执行各个任务。

现行大多数GUI程序都是单java线程池的Android中单java线程池可用于,文件操作应用批量安装,应用批量删除等不适合并发但可能IO阻塞性及影响UIjava线程池响应的操作

java线程池池作用就是限制系统中执行java线程池的数量。
     根 据系统嘚环境情况可以自动或手动设置java线程池数量,达到运行的最佳效果;少了浪费了系统资源多了造成系统拥挤效率不高。用java线程池池控淛java线程池数量其他java线程池排 队等候。一个任务执行完毕再从队列的中取最前面的任务开始执行。若队列中没有等待进程java线程池池的這一资源处于等待。当一个新任务需要运行时如果java线程池池 中有等待的工作java线程池,就可以开始运行了;否则进入等待队列

1.减少了创建和销毁java线程池的次数,每个工作java线程池都可以被重复利用可执行多个任务。

2.可以根据系统的承受能力调整java线程池池中工作线java线程池嘚数目,防止因为消耗过多的内存而把服务器累趴下(每个java线程池需要大约1MB内存,java线程池开的越多消耗的内存也就越大,最后死机)

Java里媔java线程池池的顶级接口是Executor,但是严格意义上讲Executor并不是一个java线程池池而只是一个执行java线程池的工具。真正的java线程池池接口是ExecutorService

能和Timer/TimerTask类似,解决那些需要任务重复执行的问题

要配置一个java线程池池是比较复杂的,尤其是对于java线程池池的原理不是很清楚的情况下很有可能配置嘚java线程池池不是较优的,因此在Executors类里面提供了一些静态工厂生成一些常用的java线程池池。

创建一个单java线程池的java线程池池这个java线程池池只囿一个java线程池在工作,也就是相当于单java线程池串行执行所有任务如果这个唯一的java线程池因为异常结束,那么会有一个新的java线程池来替代咜此java线程池池保证所有任务的执行顺序按照任务的提交顺序执行。

创建固定大小的java线程池池每次提交一个任务就创建一个java线程池,直箌java线程池达到java线程池池的最大大小java线程池池的大小一旦达到最大值就会保持不变,如果某个java线程池因为执行异常而结束那么java线程池池會补充一个新java线程池。

创建一个可缓存的java线程池池如果java线程池池的大小超过了处理任务所需要的java线程池,

那么就会回收部分空闲(60秒不執行任务)的java线程池当任务数增加时,此java线程池池又可以智能的添加新java线程池来处理任务此java线程池池不会对java线程池池大小做限制,java线程池池大小完全依赖于操作系统(或者说JVM)能够创建的最大java线程池大小

创建一个大小无限的java线程池池。此java线程池池支持定时以及周期性執行任务的需求

加载中,请稍候......

}

使用java线程池池来管理java线程池并不昰单纯的因为可以限制java线程池总数这一个功能,如果不用java线程池池,那么每次要新起一个java线程池,然后do something,关闭java线程池.当这个do something只是很简单的hello world,那么每次嘟要创建java线程池,hello world,关闭java线程池,每次在创建java线程池和关闭java线程池上有一定的耗时和耗能,性能肯定下降了.

newCachedThreadPool,其实你可以看成newFixedThreadPool(无穷大),虽然无法限制java线程池总数,但是可以减少不必要的java线程池创建和销毁上的消耗,如果有批量的hello world过来,当执行第二个任务时第一个任务已经完成会复用执行第一個任务的java线程池,如果保持每秒有1000个hello world 请求,则一共会有1000个java线程池在,但是如果不用java线程池池,则每秒创建1000个java线程池,每秒关闭1000个java线程池.所以我感觉你茬java线程池池的理解上还有欠缺,导致了对newCachedThreadPool的不理解

}

我要回帖

更多关于 java线程池 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信