ThreadPoolExecutor应用

ThreadPoolExecutor JDK能够提供的线程池, 大家可以往这个线程池里面扔东西,让它自己去运行,首先看戏如何定义一个线程池:
这里面有7个 参数:
public ThreadPoolExecutor(
int corePoolSize, 核心线程数
int maximumPoolSize, 最大线程数
long keepAliveTime, 生存时间,线程多久没干活请归还操作系统
TimeUnit unit,生存时间的单位
BlockingQueue workQueue, 任务队列
ThreadFactory threadFactory, 线程工厂
RejectedExecutionHandler handler 拒绝策略
) {}

public class ThreadPoolDemo01 {
    
    

    static class Mytask implements Runnable {
    
    
        private int i;

        @Override
        public void run() {
    
    
            System.out.println("线程名字:" + Thread.currentThread().getName() + " Task i:" + i);
            try {
    
    
                System.in.read();  //线程阻塞在这里
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }

        public Mytask(int i) {
    
    
            this.i = i;
        }

        @Override
        public String toString() {
    
    
            return "task{" +
                    "i=" + i +
                    '}';
        }
    }

    public static void main(String[] args) {
    
    

        //顺序:先执行 核心线程-任务队列-最大线程-拒绝策略
        ThreadPoolExecutor tpe = new ThreadPoolExecutor(
                2,   //核心线程数
                4, //最大线程数
                60,  //生存时间,线程很长时间没干活,请归还给操作系统
                TimeUnit.SECONDS,  //生存时间的单位
                new ArrayBlockingQueue<>(4), //任务队列
                Executors.defaultThreadFactory(),//线程工厂
                new ThreadPoolExecutor.CallerRunsPolicy());  //拒绝策略
        for (int i = 0; i < 7; i++) {
    
    
            tpe.execute(new Mytask(i));
        }
        System.out.println("任务队列:" + tpe.getQueue());
        // tpe.execute(new Mytask(100));
        //System.out.println(tpe.getQueue());
        tpe.shutdown();
    }
}

执行顺序:
首先,线程先上来,看下要求的核心线程数,核心线程没满的话,直接运行,如果核心线程已满,放到等待队列里面,如果等到队列也满了,就直接运行,直到总运行数达到最大线程数为止,如果等待队列和最大线程都满了,则执行拒绝策略

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yanfei464486/article/details/112983785