heima并发16---并发工具(1)--自定义-线程池--199-208

---------------------------------------199---------------------------------------------

线程池:

线程问题:多,上下文切换问题。

线程池的组件:

生产者消费者平衡速率差异的。

生产者迟迟没有提交新的任务,消费者线程在阻塞队列队列里面等待。

BlockingQueue任务太多出来的任务放在阻塞队列。

---

我们自定义一下阻塞队列:

容量确定的话就用ArrayQueue队列是阻塞队列的基础:https://blog.csdn.net/love667767/article/details/80365068

在阻塞队列写一个典型的生产者和消费者这模型:

阻塞队列的属性:

1.任务队列ArrayQueue在很多情况下比LinkList好一些。

2.锁ReentrantLock。

3.生产者在哪里阻塞的fullWaitSet。

4.消费者在哪里阻塞emptyWaitSet。

5.容量:capcity。

condition必须跟lock的。

ReentrantLock:https://blog.csdn.net/weixin_39407066/article/details/88698169

---200---

改进超时时间。

超时的等待,通过true和false去判断是不是结束了。

虚假唤醒就是唤醒了再等待要减去时间的。

---201---

实现线程池:

线程池的属性:

这个是我们自定义的。

---202---

有任务但是线程不足的话任务就放在阻塞队列里面。

当任务数没有超过核心数的时候,就创建线程对象执行任务。

worker:

 

用其他的变量,方法是以参数的形式传递的,类是成员变量的形式传递的。

这个是重用线程的精髓的。

插入一个知识点就是如何实现线程的重用:我的理解就是在线程的run方法,一直while,在task队列取任务,直到不能取出任务然后跳出while循环,删除线程。任务执行完了线程的生命周期结束就在线程集合删除线程。

线程的执行:

else就是否则就放在队列里面,为什么直接放在队列里面就可以,因为线程已经在线程池初始化之后就开始运行了。

一旦推出循环必须移除worker,不能用了。

线程不可以多次start:https://www.cnblogs.com/stm32stm32/p/9195318.html

---203---

测试:

条件核心线程数是2 , 线程是5

简单测试下运行的流程:

问题,任务执行完毕了但是线程还是没有结束的,卡在哪里了呢?

卡在阻塞队列里面,就是在运行的时候任务队列是空的是可以的一直阻塞的,但是你已经完事了,就不能在空的里面一直阻塞了。

你不能让他始终阻塞的。

设置等待超时:

超时返回null了。

---204---

模拟一个情况就是任务队列也放不下了怎么办呢?

看到没开始等待了。

但是任务对队列是定长的,满了就不可以加入了,就一直等待了。

---205---

之前的思路就是我一直提交的是任务,每提交一次任务都有一个线程去处理,当任务数量大于核心线程数量的时候就放在阻塞队列里面,然后我线程去执行的话就执行我自己的任务之后再去队列取,队列没有了我就删除自己的线程。

主线程往任务队列里面放的。

拒绝策略:

第一步:带超时时间的阻塞添加

调用:

在指定的时间内没加入成功就返回fase而不是阻塞的。

---206---

拒绝策略:

策略模式。

第一步:写接口:

让任务队列和任务在一起传过去。

第二步:

在构造的时候就传入拒绝策略:

第三步:拒绝策略在构造函数就创建好了

第四步:写策略

死等:主线程执行的这个是死等。

---207---

其他的。

假如4和5进不去,放弃的话就都放弃  4抛出异常5就不执行。

---208---

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值