我有一个线程池,最大线程数为3。但是仅执行了一个线程,发生了什么事?
public class Volatile {
private volatile static boolean keepA = true;
private static boolean keepB = true;
private static ExecutorService executor = new ThreadPoolExecutor(1,
3, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>() );
public static void main(String[] args) {
executor.execute(() -> {
while (keepA) {
System.out.println("keepA running...");
}
System.out.println("keepA stop!!!!!!");
});
executor.execute(() -> {
while (keepB) {
System.out.println("keepB running...");
}
System.out.println("keepB stop!!!!!!");
});
executor.execute(() -> {
keepA = false;
keepB = false;
});
while (true) {
}
}
}
结果
保持运行...
keepA正在运行...
keepA正在运行...
......
答案 0 :(得分:3)
仅当队列已满(并且队列无限制,因此永远不会发生)时,才会启动非核心线程。
任何BlockingQueue均可用于传输和保留提交的任务。此队列的使用与池大小交互:
- 如果正在运行的线程数少于corePoolSize,则执行程序总是喜欢添加新线程而不是排队。
- 如果正在运行corePoolSize或更多线程,则执行程序总是更喜欢对请求进行排队,而不是添加新线程。
- 如果无法将请求放入队列中,则将创建一个新线程,除非该线程超过了maximumPoolSize,在这种情况下,该任务将被拒绝。
答案 1 :(得分:1)
ThreadPoolExecutor
的第一个参数是并行运行的线程的初始数量。您已将其设置为1。将其更改为3,然后重试。仅当队列已满时,此大小才应增加,但是队列的大小是无限的,并且永远不会满。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
使用给定的初始参数和默认值创建一个新的
ThreadPoolExecutor
拒绝执行处理程序。参数:
corePoolSize
-的数量 即使线程空闲,也要保留在池中的线程,除非allowCoreThreadTimeOut
已设置
maximumPoolSize
-的最大数量 池中允许的线程
keepAliveTime
-当 线程大于核心,这是超出的最大时间 空闲线程将在终止之前等待新任务。- 的时间单位
unit
-keepAliveTime
参数
workQueue
-要使用的队列 用于在执行任务之前保留任务。此队列将仅容纳 execute方法提交的可运行任务。投掷:
IllegalArgumentException
-如果满足以下条件之一:`corePoolSize < 0` `keepAliveTime < 0` `maximumPoolSize <= 0` `maximumPoolSize < corePoolSize`
NullPointerException
-如果workQueue
或threadFactory
为null