哈哈哈无关紧要的图先来一张!!!我的小新玩具总动员!!!
一.引言
有关线程池的东西相信大家没少看,但是大家都会发现别人写的线程池的知识长篇大论的,而且还有很多详细的图,
但是呢全是理论知识,看完之后就直接放入收藏夹里吃灰的那种,看了无数篇,工作中也照样啥都不会用,不知道怎么用,
用在哪里,什么场景里面用!今天我就直接分享给大家最直接的应用场景和应用代码!
二.使用场景
1.一般我们在工作当中经常会遇到有的时候要去循环遍历一个数据量很大的list集合,然后去set其中的某一个字段的值,
并且这个字段的值还需要调用接口来返回得到,打个比方你的list对象集合有1000条数据,你需要更改集合里面的每一个对象里面的name字段,
这个name字段要掉用接口来查询返回,那么也就是你需要掉用1000次接口并且set到name字段里面去,这个时候一定是非常慢的,夸张一下,假如
你每掉用一次接口需要耗时1秒钟的话,1000条数据需要调用1000次接口,也就是你这个方法需要至少1000秒才会返回结果。那简直是不能接受!
这个时候就需要用到线程池了,因为我们之所以要用1000秒,是因为我们在执行这个方法的时候其实是单线程操作的,并不是多线程,所以你的每次循环
都需要等待前一个执行完毕才能继续执行,但是如果运用多线程也就是可以多个线程一起来同时执行掉用接口操作,那么根据刚才的场景,我们再假如
我们有1000个线程来执行这个方法,可以同时执行,那么我这个方法岂不是只需要执行1秒,效率是不是非常高!用当年的高中知识,效率是呈指数型函数增长的!
(爆炸性函数)哈哈哈高中学的不好!
线程池之所以称之为“池”,就是因为它能“装”,它是一个能装线程的池子。 当然了我举的例子有点夸张,正常掉用一次接口也不用1秒,并且线程池也装不了那么多
的线程哈哈哈哈,线程池中的线程数是根据你电脑的配置情况来配置的:
IO密集型配置线程数经验值是:2N,其中N代表CPU核数。
CPU密集型配置线程数经验值是:N + 1,其中N代表CPU核数。
如果获取N的值?
int availableProcessors = Runtime.getRuntime().availableProcessors();
混合型如果IO密集型,和CPU密集型的执行时间相差不太大,可以拆分开,以便于更好配置。如果执行时间相差太大,优化的意义不大,比如IO密集型耗时60s,CPU密集型耗时1s。
计算公式:
最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
话不多说,我开始上代码
public void threadPoolTest(){
//掉用接口返回
List<XXXX> biglist=mapper.queryXXXList();
//创建线程池
ExecutorService es = new ThreadPoolExecutor(
8,16,0, TimeUnit.SECONDS,
new LinkedBlockingDeque<>(30)
);
//循环list
biglist.stream().foreach(item->{
//es.execute(()->{这段代码就是执行上面创建的线程池,写的位置就是你的循环需要
//多次掉接口的地方,写在循环的里面,这样就可以多线程去执行调用接口,
//分担循环的次数,效率提高!!!
es.execute(()->{
String xxx = mapper.selectXXX(item.getXXX);
item.setXXX(xxx);
});
//在这里运用es.execute使用线程池里面的线程,最多16个,也就是同时可以
//执行16个掉用接口,假如集合中有800条数据,需要掉用800次,那么16个线程,
//每次接口需要1秒,那么这个就只需要大概800/16=50秒(不准确大概)
})
}
这就是其中的一种最简单的实现方法, 具体代码根据你们自己的业务需求来就行了,这就是是最基础的一种写法和用法,还有很多中用法,
只有先入了门能运用才是王道,之后你们就可以钻研线程池的更深层次的用法,哈哈哈我就分享到这里,不懂线程池的同学可以去试下!!!
然后关于线程池的其他用法,和参数我就不再赘述了!!!
感谢观看,不喜勿喷!觉得ok点个赞哦哈哈
最后来一张上海我家附近啦啦宝都商场的高达帅气图