技术交流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,这样就可以
满足始终只有一个线程在执行任务了.