多线程与高并发编程(七)【线程池一】

一、线程池前置

1. Executor接口 executor()

2. ExecutorSevice接口,定义了很多线程池的生命周期的方法

  submit() 提交callable接口给线程池运行,异步的,当前线程提交一下就离开了

3. Callable接口(定义了call()),类似runnable,是一个任务,但是相比runnable中的run()多了个返回值。

4. Future接口,承接ExecutorService方法中的返回值,是一个结果

  future.get() 阻塞的,等待什么时候future中有返回值运行

5. FutureTak类,既是一个任务(runnable),又是一个结果(更好用的)

  自己可以定义任务,也可以承接返回值。
在这里插入图片描述

6. CompletableFuture,本身可以承接数据(有兴趣可以研究,内容非常多,是一个比较高层的类)

  .supplyAsync(callable) 分一个线程异步的进行操作 ret = 本身
  .allOf(CompletableFuture1, CompletableFuture2…) 合并参数里面的多个任务,其中只要有一个任务有返回值,则全部结束
  .thenApply(operate) 接着执行
  .thenAccept(operate)
在这里插入图片描述

二、线程池

  线程池JDK一共提供了大体两个:
    ThreadPoolExecutor、ForkJoinPool
  一个线程池维护两个集合(用的HashSet),一个集合是一个个任务,一个集合是一个个线程。
在这里插入图片描述

1. ThreadPoolExecutor

  手工定义一个线程池:
在这里插入图片描述
  上图中线程池的七个参数含义(大厂面试高频背过):

① 核心线程数:最开始时存在线程,不会被生存时间限制未活跃时间,可以一直存在(有一个方法可以让核心线程参与,但一般不会指定)。

② 最大线程数:核心线程+非核心线程,最大可以扩充到多少。

③ 生存时间:多长时间线程(非核心线程)没活干之后,归还空间给OS。

④ 生存时间单位:意如其名。

⑤ 任务队列:上一篇《多线程与高并发编程(六)【容器】》之中讲的那些队列。

⑥ 线程工厂:一个创建线程的工厂,图中用的是默认JDK写好的,也可以自定义,需要实现ThreadFactory接口,里面只有一个newThread()

  defaultThreadFactory()源码如下
在这里插入图片描述
  new Thread() 起一个线程和名字
  isDaemon() 是否是守护线程,如果是那就把它变成非守护线程
  setPriority() 设置优先级是普通

⑦ 拒绝策略:线程池忙而且任务队列等待的满了则进行拒绝策略。JDK默认提供了四种拒绝策略,可以自定义。

  四种拒绝策略:
    Abort 抛异常
    Discard 扔掉,不抛异常
    DiscardOldest 扔掉排队时间最久的
    CallerRuns 调用者处理任务(哪个线程提交的这个任务哪个线程去处理它)

2. ForkJoinPool 分解 汇总

北京马士兵教育学习笔记整理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值