---------------------------------------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---