Java中的线程池用ThreadPoolExecutor类来表示,ThreadPoolExecutor这个类继承自抽象类AbstractExecutorService,AbstractExecutorService又实现了ExecutorService接口,ExecutorService接口又继承了Executor接口。
ThreadPoolExecutor类详细说明在本博客中其他篇幅有介绍,如果需要请参考
从参数便可以看到几个构造方式的不同,但是若跟源码之后,会发现,前面三个都调用了第四个。
跟源码之后会发现,其实这些静态方法里面也是调用了ThreadPoolExecutor的构造方法,例如:
只不过Executors帮我们配置了一些参数;下面介绍下Executors方式:
1、newCachedThreadPool方法,它创建了一个可缓存的线程池,如果线程池的长度超过处理需要,它可灵活回收空闲线程,若无可回收,则新建线程。
2、newScheduledThreadPool方法,它创建了一个定长线程池,支持定时及周期性的任务执行。
3、newFixedThreadPool 方法,它创建了一个定长线程池,可以控制线程最大并发数,超出的线程会在队列中等待。
4、newSingleThreadExecutor方法,它创建了一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有的任务按照指定的顺序(FIFO, LIFO, 优先级)来执行的。
一、newCachedThreadPool(可以缓存的线程池)
首先,我们一起来创建一个可以缓存的线程池,如果线程池的长度超过了处理需要的话,它可灵活的回收空闲的线程,若无可回收的线程,则就新建线程。代码如图1所示:
当前线程:pool-1-thread-1输出:0
当前线程:pool-1-thread-1输出:1
当前线程:pool-1-thread-1输出:2
当前线程:pool-1-thread-1输出:3
当前线程:pool-1-thread-1输出:4
当前线程:pool-1-thread-1输出ÿ