手动配置ThreadPoolExecutor,执行线程任务

public class ThreadPoolTest2 {

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

        for (int i = 0; i < 15; i++) {
            MyTask myTask = new MyTask(i);
            executor.execute(myTask);
            System.out.println(
                    "线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" + executor.getQueue()
                            .size() + ",已执行完毕的任务数目:" + executor.getCompletedTaskCount());
        }
        
        //不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务
        executor.shutdown();
    }

    static 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 + "执行完毕");
        }
    }

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

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

你可能感兴趣的:(Java)