线程池的相关知识点

1.继承关系.

先来看一下继承关系,其中Executer是顶层接口.ThreadPoolExecuter是创建线程池的主要实现类.
在这里插入图片描述

2.Java为我们提供的现有创建线程池的方法.

1.public static ExecutorService newFixThreadPool(int nThread):
在这里插入图片描述
    该方法会返回一个固定大小的线程池,如果有新的任务来,又没有空闲的线程的话,就会把任务交到等待队列中,等待队列使用的阻塞队列,近似于无界.

2.public static ExecutorService newCatchThreadPool();
在这里插入图片描述
    该方法得到的线程数量不是固定的,会根据实际进行调整,如有新的任务,而没有空闲的线程,就会新new一个线程去执行任务…

3.public static ExecutorService newSingleThreadPool();
在这里插入图片描述
    返回一个单个线程的线程池.

注意点:

  • 这几个方法均为Executors类的静态方法,可通过类名直接调用,创建线程池.
  • 这几个方法返回ExecutorService接口,ExecutorService开启线程执行任务的方法有两个,submit()和executer(),submit()是executer()的扩展方法,可执行当前任务并接收线程返回的对象,使调用者可以得到线程返回结果.例:
 public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        Future<Object> future = executorService.submit(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                return new Object();
            }
        });
        try {
            System.out.println(future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

输出结果:
在这里插入图片描述

3.三种现有线程池得底层实现原理.

其实细心得同学已经看出来的了,这三种实现方法底层都是ThreadPoolExecutor类实现的,只不过传入参数不一样.构造方法的参数.
参数分别是

  1. int corePoolSize, 核心线程数,可以理解为正式员工,可以一直存在.

  2. int maxmumPoolSize, 线程池中的最大线程数.最大线程数-核心线程数=非核心线程数.
    非核心线程数就可以理解为外包人员,只能存在一定的时间.

  3. long keepAliveTime, 线程数超过指定数值(corePoolSize)后,空闲线程的存活时间,也就是非核心线程存活的时间.

  4. TimeUnit unit,线程池维护线程所允许的时间单位

  5. BlockingQueue workQueue 被提交但未被执行的任务 所使用的队列

分别解释各个类的实现:
1.FixedThreadPool
      corePoolSize和maximumPoolSize都是传入的最大线程数,意思只有核心线程,第三个参数存活时间为0,也就是非核心线程存活时间为0.
第五个参数是无界队列,意思是当队列数达到maximumPoolSize后,又有新任务时,就把任务加到无线队列中等待.直至内存被用完.
2.CatchThreadPool
      corePoolSize是0,Integer.MAX_VALUE表示无穷大,意思没有核心线程,只有非核心线程,存活时间为60秒,使用队列是直接提交队列,就是提交到队列中的任务会被直接执行,如果有空闲线程,
使用空闲线程,如果没有,而,Integer.MAX_VALUE又是无穷大,就会直接新建一个线程去执行任务.
3.newThreadPool
      corePoolSize和maximumPoolSize都是1来保证只有一个线程.

补充阻塞队列:
LinkedBlockingQueue<>() 基于链表的无界队列
ArrayBlockingQueue<>(5) 基于数组的有界队列
SynchronousQueue 无缓冲的等待队列,无界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员bling

义父,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值