线程池的简单使用

一.  线程池的构造方法

​
public ThreadPoolExecutor(
    //核心池大小
    int corePoolSize,
    //最大线程数量
    int maximumPoolSize,
    //线程空闲时最大存活时间
    long keepAliveTime,
    //时间单位
    TimeUnit unit,
    //阻塞队列,也叫任务缓存队列
    BlockingQueue workQueue,
    //线程工厂,生产线程
    ThreadFactory threadFactory,
    //任务拒绝策略
    RejectedExecutionHandler handler){}

​

二.  实例

1. 代码

public class ThreadTest extends Thread {
    private int i;
    public ThreadTest(int i){
        this.i = i;
    }
    @Override
    public void run() {
        System.out.println("正在执行"+ i + "任务...");
    }
}
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolTest {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 15, 1l, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(5));
        for (int i = 0; i < 18; i++) {
            ThreadTest threadTest = new ThreadTest(i);
            threadPoolExecutor.execute(threadTest);
            System.out.println("线程池中的线程数目:" + threadPoolExecutor.getPoolSize());
            System.out.println("队列等待执行的任务数目:" + threadPoolExecutor.getQueue().size());
            System.out.println(" 执行完毕的线程数目:" + threadPoolExecutor.getCompletedTaskCount());
        }
        threadPoolExecutor.shutdown();
    }
}

2. 运行结果

线程池中的线程数目:1
队列等待执行的任务数目:0
 执行完毕的线程数目:0
线程池中的线程数目:2
队列等待执行的任务数目:0
 执行完毕的线程数目:0
线程池中的线程数目:3
队列等待执行的任务数目:0
 执行完毕的线程数目:0
线程池中的线程数目:4
队列等待执行的任务数目:0
 执行完毕的线程数目:0
线程池中的线程数目:5
队列等待执行的任务数目:0
 执行完毕的线程数目:0
线程池中的线程数目:6
队列等待执行的任务数目:0
 执行完毕的线程数目:0
线程池中的线程数目:7
队列等待执行的任务数目:0
 执行完毕的线程数目:0
线程池中的线程数目:8
队列等待执行的任务数目:0
 执行完毕的线程数目:0
线程池中的线程数目:9
队列等待执行的任务数目:0
 执行完毕的线程数目:0
线程池中的线程数目:10
队列等待执行的任务数目:0
 执行完毕的线程数目:0
线程池中的线程数目:10
队列等待执行的任务数目:1
 执行完毕的线程数目:0
线程池中的线程数目:10
队列等待执行的任务数目:2
 执行完毕的线程数目:0
线程池中的线程数目:10
队列等待执行的任务数目:3
 执行完毕的线程数目:0
线程池中的线程数目:10
队列等待执行的任务数目:4
 执行完毕的线程数目:0
线程池中的线程数目:10
队列等待执行的任务数目:5
 执行完毕的线程数目:0
线程池中的线程数目:11
队列等待执行的任务数目:5
 执行完毕的线程数目:0
线程池中的线程数目:12
队列等待执行的任务数目:5
 执行完毕的线程数目:0
线程池中的线程数目:13
队列等待执行的任务数目:5
 执行完毕的线程数目:0
正在执行0任务...
正在执行10任务...
正在执行11任务...
正在执行12任务...
正在执行13任务...
正在执行14任务...
正在执行1任务...
正在执行3任务...
正在执行2任务...
正在执行4任务...
正在执行5任务...
正在执行6任务...
正在执行7任务...
正在执行8任务...
正在执行9任务...
正在执行15任务...
正在执行16任务...
正在执行17任务...

Process finished with exit code 0

三. 总结

1. 当线程池中的线程数量小于或等于核心池大小时,每来一个新任务线程池会创建一个线程去执行它

2. 当线程池中的线程数量大于核心池大小时,每来一个新任务,线程池会将新任务加入到缓存队列中去。如果添加成功,则任务等待线程执行;如果添加失败,则线程池创建新的线程去执行这个任务。

3. 当线程池中的线程数目大于maximumPoolSize时,线程池拒绝再添加新的线程,反而采用线程拒绝策略拒绝任务执行。

你可能感兴趣的:(线程池的简单使用)