使用线程池创建线程

例子:

package com.example.demo.thread;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

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

        for (int i = 1; i < 16; i++) {
            MyTask myTask = new MyTask(i);
            executor.execute(myTask);
            System.out.println("线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" +
                    executor.getQueue().size() + ",已执行完别的任务数目:" + executor.getCompletedTaskCount());
        }
        executor.shutdown();
    }
}

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
1
线程池中线程数目:1,队列中等待执行的任务数目:0,已执行完别的任务数目:0
线程池中线程数目:2,队列中等待执行的任务数目:0,已执行完别的任务数目:0
正在执行task 2
线程池中线程数目:3,队列中等待执行的任务数目:0,已执行完别的任务数目:0
正在执行task 3
线程池中线程数目:4,队列中等待执行的任务数目:0,已执行完别的任务数目:0
正在执行task 4
正在执行task 5
线程池中线程数目:5,队列中等待执行的任务数目:0,已执行完别的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:1,已执行完别的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:2,已执行完别的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:3,已执行完别的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:4,已执行完别的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:5,已执行完别的任务数目:0
线程池中线程数目:6,队列中等待执行的任务数目:5,已执行完别的任务数目:0
正在执行task 11
线程池中线程数目:7,队列中等待执行的任务数目:5,已执行完别的任务数目:0
正在执行task 12
线程池中线程数目:8,队列中等待执行的任务数目:5,已执行完别的任务数目:0
正在执行task 13
线程池中线程数目:9,队列中等待执行的任务数目:5,已执行完别的任务数目:0
正在执行task 14
正在执行task 15
线程池中线程数目:10,队列中等待执行的任务数目:5,已执行完别的任务数目:0
task 1执行完毕
task 2执行完毕
task 13执行完毕
正在执行task 6
task 5执行完毕
task 12执行完毕
正在执行task 8
task 11执行完毕
task 3执行完毕
正在执行task 10
task 4执行完毕
正在执行task 9
正在执行task 7
task 15执行完毕
task 14执行完毕
task 6执行完毕
task 10执行完毕
task 9执行完毕
task 7执行完毕
task 8执行完毕

Process finished with exit code 0

 

模拟有15个任务, 首先会使用 5个线程来执行5个任务,之后5个任务会放入到队列(队列容量为5)当中,队列放满来之后,

如果没有达到设置到最大线程数,就会继续使用线程(这里10-5=5) 5个。等线程中有执行完任务的线程,会把队列的任务取出来执行

posted @ 2020-05-06 00:13  小污龟  阅读(632)  评论(0编辑  收藏  举报