JAVA线程池_并发队列工作笔记0003---线程池的分类_可缓存线程池_定长线程池_定时线程池_单例线程池

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152

这里说线程池的分类

有可缓存类型,

定长类型,

定时类型,

单例类型,

这里我这次用ExecutorService这个线程池.

然后循环执行100个任务.

去执行一下,可以看到这里,其实也有重复的线程,这说明比如,我有100个任务但是,用这个ExecutorService

这个线程池的时候,系统也没有给我分配100个线程来执行,而是发现某个线程执行完空闲了,然后它就拿过这个空闲的

线程来用了,所以看到,有重复的线程,也就这个线程执行完一个任务,又执行了一个任务,不会再去创建新线程了.

 

他内部有自己的管理逻辑.

可以看到这个线程池ExecutorService,实际上还是用的上一节说的那个线程池

ThreadPoolExecutor来创建的,

并且,这里的参数,核心线程数是0,也就说,来了一个任务我就创建一个线程,来了一个任务我就创建一个线程,

不会预先给他启动线程.

然后Integer.MAX_VALUE线程最大数,意思就是我可以启动这么多的线程,这个数是20多个亿,也就是

说是完全可以满足需求的,然后

如果新建的线程不再使用了就等60秒空闲的时候,就会被销毁掉,

然后最后这个是SynchronousQueue<Runnable>()这个队列

SynchronousQueue我们可以去看看这个队列

这个队列也是个阻塞队列对吧,我们说,所有的线程池用的都是阻塞队列.

而且我们执行的结果来看,虽然我们有100个任务,然后启动以后,线程池也没有创建100个线程来同时处理任务

可以看到线程池中有重复的线程,这就是说,虽然有100个任务,但我们也没必要启动100个线程来对应,因为一个线程

处理完一个任务,就可以接着去处理另一个任务,没必要等待再去创建线程,因为创建线程需要的时间比较长.

可缓存类型 这个就是可缓存类型的队列.

 

然后再看一个定长线程队列

这里这个线程池我传入3,也就是队列的长度是3

可以执行看到,这100个任务都是这3个线程来执行的

然后再看定时线程队列:

这个定时队列就是ScheduledExecutorService,后面每个任务都有一个3,TimeUnit.SECONDS

就是说,每个任务添加以后,都要间隔3秒再去执行.

然后再看最后一个类型是

单例队列:

可以看到单例线程队列,执行的时候,就只有一个线程去执行任务

然后

可以看到其实,单例线程队列就是把核心线程数设置为1,然后最大线程数也设置为1,这样就可以

满足始终只有一个线程在执行任务了.

 

 

 

 

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页