Java从1.5之后提供的线程池,提高线程的复用,因为线程的开启回收很消耗内存
线程池的基本创建
- 第一个参数,核心线程
- 第二个参数,非核心线程,线程池的最大容量
- 第三个参数/第四个参数,为线程的闲置时间,如果小于当前设置时间,则会复用,否则当前Runnable回被回收
- 第五参数,为任务队列,把超出任务放到缓存队列中
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
val executorService = ThreadPoolExecutor(
1,
5,
5, TimeUnit.SECONDS,
LinkedBlockingDeque<Runnable>()
)
Java中提供了封装好的线程池工具类用于创建线程
- 例1:创建缓存线程池
val cache = Executors.newCachedThreadPool()
其内部实现如下:
//缓存线程池的实现 类似于Executors.newCachedThreadPool()的实现
val cacheExecutorServer = ThreadPoolExecutor(
0, Int.MAX_VALUE, 60, TimeUnit.SECONDS, LinkedBlockingDeque<Runnable>()
)
- 例2:创建核心线程池
Executors.newFixedThreadPool(5)
其内部具体实现等同于如下:
new ThreadPoolExecutor(5, 5,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>())
除了如上实现以外,单例线程池newSingleThreadExecutor和newScheduledThreadPool内部也是同理都是基于ThreadPoolExecutor进行了封装
在OkHttp中使用的缓存线程池实现如下:
public synchronized ExecutorService executorService() {
if (executorService == null) {
executorService = new ThreadPoolExecutor(0,
Integer.MAX_VALUE, 60,
TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false));
}
return executorService;
}
日常使用中也可以通过线程工厂的方式进行创建线程,如下:
ThreadPoolExecutor(0,
Int.MAX_VALUE,
60L,
TimeUnit.SECONDS,
SynchronousQueue(),
ThreadFactory {
val thread = Thread()
thread.name = "First ThreadExecutor"//线程的名字
thread.isDaemon = false//非守护线程
thread
})
守护进程,依赖于当前线程的生命周期,如果当前进程执行结束了,则该线程也会终止.