路边的煎饼小贩一般都是先做好几个煎饼还放着,有人买则直接交货而不是现做,现做浪费客人的时间,如果没有现成的只有现做煎饼,当然会牺牲客人的时间!!
这就是线程池
Java通过Executors提供四种线程池,分别为:
- newCachedThreadPool创建一个可缓存线程池,最大长度是Interger. MAX_VALUE,如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程
- newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。但在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源
- newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。可以当做Timer定时器
- newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
-
newCachedThreadPool
如果线程池里有空闲的线程则调用,没有则新建。因为这个线程池不限制大小,所以要小心使用(不推荐使用)
使用线程池 -
newFixedThreadPool
存放的线程有大小限制,超出的线程会在队列中等待,不会无限制存放线程,使用和上图一样。 -
newScheduledThreadPool
定长线程池,可以当做时定时器哦
GIF.gif
Paste_Image.png -
newSingleThreadExecutor
单线程化的线程池
GIF.gif
以上线程池可以调用xx.shutdown()
关闭,否则程序会一直挂起
-
ThreadPoolExecutor
这个是上面四个线程池的底层实现具体情况看这里