具体使用示例

    public class Test {
    public static void main(String[] args) {
    ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,
    new ArrayBlockingQueue(5));

    1. for(int i=0;i<15;i++){
    2. MyTask myTask = new MyTask(i);
    3. executor.execute(myTask);
    4. System.out.println("线程池中线程数目:"+executor.getPoolSize()+",队列中等待执行的任务数目:"+
    5. executor.getQueue().size()+",已执行玩别的任务数目:"+executor.getCompletedTaskCount());
    6. }
    7. executor.shutdown();
    8. }

    }

    class MyTask implements Runnable {
    private int taskNum;

    public MyTask(int num) {
        this.taskNum = num;
    }
    
    @Override
    public void run() {
        System.out.println("正在执行task "+taskNum);
        try {
            Thread.currentThread().sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task "+taskNum+"执行完毕");
    }
    

    }

    执行结果:

    线程池中线程数目:1,队列中等待执行的任务数目:0,已执行玩别的任务数目:0
    正在执行task 0
    线程池中线程数目:2,队列中等待执行的任务数目:0,已执行玩别的任务数目:0
    线程池中线程数目:3,队列中等待执行的任务数目:0,已执行玩别的任务数目:0
    正在执行task 1
    正在执行task 2
    线程池中线程数目:4,队列中等待执行的任务数目:0,已执行玩别的任务数目:0
    正在执行task 3
    线程池中线程数目:5,队列中等待执行的任务数目:0,已执行玩别的任务数目:0
    线程池中线程数目:5,队列中等待执行的任务数目:1,已执行玩别的任务数目:0
    线程池中线程数目:5,队列中等待执行的任务数目:2,已执行玩别的任务数目:0
    线程池中线程数目:5,队列中等待执行的任务数目:3,已执行玩别的任务数目:0
    线程池中线程数目:5,队列中等待执行的任务数目:4,已执行玩别的任务数目:0
    线程池中线程数目:5,队列中等待执行的任务数目:5,已执行玩别的任务数目:0
    正在执行task 4
    线程池中线程数目:6,队列中等待执行的任务数目:5,已执行玩别的任务数目:0
    线程池中线程数目:7,队列中等待执行的任务数目:5,已执行玩别的任务数目:0
    正在执行task 11
    正在执行task 10
    线程池中线程数目:8,队列中等待执行的任务数目:5,已执行玩别的任务数目:0
    正在执行task 12
    线程池中线程数目:9,队列中等待执行的任务数目:5,已执行玩别的任务数目:0
    正在执行task 13

    1. 线程池中线程数目:10,队列中等待执行的任务数目:5,已执行玩别的任务数目:0

    正在执行task 14
    task 1执行完毕
    task 0执行完毕
    正在执行task 5
    正在执行task 6
    task 12执行完毕
    task 11执行完毕
    正在执行task 8
    task 10执行完毕
    正在执行task 9
    task 3执行完毕
    task 2执行完毕
    task 4执行完毕
    task 13执行完毕
    正在执行task 7
    task 14执行完毕
    task 5执行完毕
    task 6执行完毕
    task 9执行完毕
    task 7执行完毕
    task 8执行完毕

    1. 从执行结果可以看出,当线程池中线程的数目大于5时,便将任务放入任务缓存队列里面,当任务缓存队列满了之后,便创建新的线程。如果上面程序中,将for循环中改成执行20个任务,就会抛出任务拒绝异常了。