线程池参数讲解,及什么时候会创建新线程执行新任务

public class Principle {

    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3));
        for (int i = 1; i <= 6; i++) {
            TaskThred t1 = new TaskThred("任务" + i);
            executor.execute(t1);
        }
        executor.shutdown();
    }
}

class TaskThred implements Runnable {
    private String taskName;

    public TaskThred(String taskName) {
        this.taskName = taskName;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + taskName);
    }

}

结果

pool-1-thread-1任务1
pool-1-thread-2任务2
pool-1-thread-2任务3
pool-1-thread-2任务4
pool-1-thread-2任务5
pool-1-thread-3任务6

 现在是有创建三个线程在执行任务

如果把循环改成5次

结果

pool-1-thread-2任务2
pool-1-thread-2任务3
pool-1-thread-1任务1
pool-1-thread-2任务4
pool-1-thread-1任务5

 说个结论,在配置2个核心线程,4个最大线程,3个缓存队列情况下

1.当要执行的任务 ≤ 核心线程+队列缓存,就只会有2个工作线程在执行任务,2就是我配的核心线程数(工作线程)

2.当要执行的任务 > 核心线程+队列缓存,多一个任务就多创建一个新的线程执行,总的线程小于最大线程数

3.当要执行的任务 > 最大线程数+队列缓存,第8个任务直接报错

线程池参数讲解,及什么时候会创建新线程执行新任务_第1张图片

线程池参数讲解,及什么时候会创建新线程执行新任务_第2张图片

线程池参数讲解,及什么时候会创建新线程执行新任务_第3张图片

核心线程就是在不大于队列+核心线程数情况下会调用的工作线程,配3个那就会有3个工作线程在执行任务,

队列+核心线程数

 

 

 

 

 

 

 

你可能感兴趣的:(ĴAVA基础,线程)