需求:用一个线程每两秒检测***状态,当不想检测时,用另一个线程将其停止
在一个线程 T1 中如何“优雅”终止线程 T2?这里的【优雅】指的是给 T2 一个料理后事的机会。
错误思路:
没有机会释放锁
,其它线程将永远无法获取锁实现方式:
即 Guarded Suspension,一个线程等待另一个线程的执行结果
要点
有一个结果需要从一个线程传递
到另一个线程,让他们关联同一个 GuardedObject
JDK 中,join 的实现
、Future
的实现,采用的就是此模式
因为要等待另一方的结果
,因此归类到同步
模式
带超时版:
测试:
总结:
join 底层就是用到了这种思路,保护型的暂停模式,暂停指的是当条件不满足时wait等待。
线程 1 输出 a 5 次,线程 2 输出 b 5 次,线程 3 输出 c 5 次。现在要求输出 abcabcabcabcabc 怎么实现?
Park Unpark 版:
首先进入打印方法时先都park住,主线程unpark A线程,A线程打印a并且unpark B线程,B线程打印b并unpark C线程,以此类推。
当然这是用park unpark,当然用wait notify 以及 ReentrantLock里面的条件变量也是可以实现的。
同步模式之 Balking:一个线程发现另一个线程或本线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回
用在:当前端页面多次点击按钮调用 start 时
Boolean,Byte,Short,Integer
,Long
,Character 等包装类提供了valueOf
方法,例如 Long 的valueOf 会缓存 -128~127
之间的 Long 对象
,在这个范围之间会重用对象
,大于这个范围,才会新建 Long 对象
:
口述:
Integer的valueof提供了这种享元模式下的创建方式,其实就是将-128~127之间的Integer对象缓存起来,当创建的是在这个范围就之前返回存储的对应的对象就ok,其实享元的设计思路就是减少创建对象,因为这些都是不可变类,像string啊这些我们在修改时,不会修改原值而是会将char拷贝然后重新new一个出来,在吧new出来的引用赋值,那这样每次修改就会创建,会导致创建的太多了,那享元模式的话就是比如说常用的 值得话我就提前创建好对象放到缓存中,如果在这个范围之内得话你就直接在缓存中拿,不用new了,减少了创建对象得数量。
也体现了经典设计模式中的享元模式,重用线程对象嘛!
固定大小线程池会有饥饿现象
解决办法:针对不同的任务类型
,采用不同的线程池
,例如: