江的福的小本本之线程池

在这里插入图片描述
线程池的底层是阻塞队列,这一点需要注意。
在这里插入图片描述
ThreadPoolExecutor是重点
Executors是线程池的工具类。
在这里插入图片描述

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyThreadPoolDemo {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        try {
            for (int i=0;i<10;i++) {
                executorService.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "   开始办理");
                });
            }
        }catch (Exception e ){
            e.printStackTrace();
        }finally {
            executorService.shutdown();
        }

    }
}

结果:

pool-1-thread-3   开始办理
pool-1-thread-5   开始办理
pool-1-thread-5   开始办理
pool-1-thread-3   开始办理
pool-1-thread-5   开始办理
pool-1-thread-5   开始办理
pool-1-thread-3   开始办理
pool-1-thread-2   开始办理
pool-1-thread-1   开始办理
pool-1-thread-4   开始办理

一池一个处理线程:
ExecutorService executorService=Executors.newSingleThreadExecutor();
可扩容的线程池(一池n个处理线程):
ExecutorService executorService=Executors.newCachedThreadPool();

底层初窥:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
发现三者源码都是实现了一个ThreadPoolRxecutor。所以接着来看ThreadPoolRxecutor。

七大参数:
在这里插入图片描述
在这里插入图片描述
生活中的case:
1、corePoolSize:今天有多少个人属于正常值班。
2、maxmumPoolSize:网点一共能容许多少人同时值班。
3、4:keepAliveTime(时间)& unit(单位):加班人员没有工作量后多长时间可下班的规定时间。
5、workQueue:候客区(即阻塞队列)
6、threadFactory:网点的一些默认规范。
7、handler:人满为患时,如何拒绝再来办理业务的客人。

在这里插入图片描述
底层工作原理:
在这里插入图片描述
正常工作–>进入阻塞队列—>叫人加班—>拒绝策略
先看corePoolSize,再看阻塞队列,再看maximumpool,接着执行拒绝策略。
在这里插入图片描述

在这里插入图片描述
jdk内置的拒绝策略
是什么?
在这里插入图片描述
有哪些?
在这里插入图片描述
以上内置策略,均实现了RejectedExecutionHandler接口。
工具类中的那三个方法如果在工作中,你会用哪一个?
哈哈,被套路了吧。正确答案是一个都不用。
为什么不用呢?(无界阻塞队列,堆被瞬间 充满)

在这里插入图片描述
代码:

import java.util.concurrent.*;

public class MyThreadPoolDemo {
    public static void main(String[] args) {
        //ExecutorService executorService=Executors.newCachedThreadPool();
       // ExecutorService executorService=Executors.newSingleThreadExecutor();
        //ExecutorService executorService = Executors.newFixedThreadPool(5);
        ExecutorService executorService =new ThreadPoolExecutor(2,
                5,
                1L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(3),
                Executors.defaultThreadFactory(),
                new  ThreadPoolExecutor.DiscardOldestPolicy());
                //new  ThreadPoolExecutor.CallerRunsPolicy());
                //new ThreadPoolExecutor.AbortPolicy());
                //new ThreadPoolExecutor.DiscardPolicy());
        try {
            for (int i=1;i<=18;i++) {
                executorService.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "   开始办理");
                });
            }
        }catch (Exception e ){
            e.printStackTrace();
        }finally {
            executorService.shutdown();
        }

    }
}

maxmumPoolSize+阻塞队列初始值应该为:?

io密集型:
在这里插入图片描述
CPU密集型:
在这里插入图片描述

发布了51 篇原创文章 · 获赞 11 · 访问量 1767

猜你喜欢

转载自blog.csdn.net/weixin_45276914/article/details/105357203