文章目录
前言
提示:我们需要根据不同的场景选择使构造不同的线程池。
一、参数选择
1、 构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
...
}
这就是创建线程池的主要的构造方法。
2、corePoolSize
3、maximumPoolSize
4、keepAliveTime
5、BlockingQueue workQueue
6、ThreadFactory threadFactory
7、RejectedExecutionHandler handler
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、Executors 中五种常见的线程池
1. newCachedThreadPool
构造方法:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
最大线程数是Integer.MAX_VALUE,
60L, TimeUnit.SECONDS 说明了超过核心线程数的空闲线程在60秒后就会被销毁。
工作现象:
当多个线程进来时,会创建多个工作线程,处理各自任务,然后60秒后就会被销毁。
2、newFixedThreadPool
构造方法:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
核心线程等于最大线程,
通过源码我们知道当worker在getTask为null时,这个工作线程也就不会再执行新的任务了。
想要getTask为null,则需要工作线程数大于核心线程数,且上次拉取任务超时。
因为核心线程等于最大线程,因此,也就不会出现worker停止运行,它会一直阻塞take任务。
也就是说核心线程不会被回收,一直在重复使用。
3、newSingleThreadPool
构造方法:
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
核心线程和最大线程都是一个,有任务进来时,放入队列,顺序执行。
4、newScheduledThreadPool
5、newWorkStealingPool
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。