一个鼓,左右手轮流敲打。
来源:互联网 发布:核算成本的软件 编辑:程序博客网 时间:2024/04/28 03:12
这题应该算可以考虑成生成消费模型,左手生产,右手消费。但是右手敲完了,左手又成了消费者。
可以考虑使用一个boolean类型变量控制左右手敲打顺序;
true时候只允许左敲打,并阻塞右手线程,释放鼓的对象锁,让右手线程能够获取鼓资源,使用wait();
false时候只允许右手敲打,阻赛左右线程,释放鼓的对象锁,让右手线程能够获取鼓资源。
敲完之后改变敲打状态,并唤醒相反的线程 notify()。
1.因此建立了一个数据结构BitMode
2.因为左右手对鼓来讲是竞争关系,使用创建出来的BitMode 对象作为对象锁。
3.线程取消,每一次敲完之后会唤醒相反的线程。不存在取消时候生成者阻塞问题。
package com.test;
public class RecycleBit {
final static BitMode bitMode = new BitMode();
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Thread a= new Thread(){
public void run() {
try {
bitMode.doleft();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
};
Thread b= new Thread(){
public void run() {
try {
bitMode.doright();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
};
a.start();
b.start();
Thread.sleep(10);
bitMode.isexit =true;
}
publicstatic class BitMode {
volatileboolean isexit;
volatileboolean isleft = true;
int num;
public void doleft() throws InterruptedException {
while (!isexit) {
synchronized (this) {
while(!isleft){
wait();
}
hanlde(isleft);
notify();
}
}
}
public void doright() throws InterruptedException {
while (!isexit) {
synchronized (this) {
while(isleft){
wait();
}
hanlde(isleft);
notify();
}
}
}
public void hanlde(boolean isleft){
String flag;
if(isleft){
flag="A";
}else{
flag ="B";
}
this.isleft = !isleft;
System.out.println(flag+"-----"+(num++));
}
}
}
- 一个鼓,左右手轮流敲打。
- 一个切换鼠标左右手的小工具
- 一个切换鼠标左右手的小工具
- 一个切换鼠标左右手的小工具
- 左右手坐标系
- 不断的敲打
- 人左右手的奥秘
- 左右手坐标系的差别
- 左右手坐标系转换
- 左右手坐标系的区别
- 图像中左右手识别
- 左右手系,坐标变换
- 左右手坐标系的互换
- 左右手坐标系转换
- 左右手坐标系的互换
- 动态图片轮流播而且点击图片时连接到一个新闻地址
- 是谁在敲打我窗
- 左右手互博的感觉
- java 反射通过类名获取对象
- Java程序员使用的20几个大数据工具
- 给公司的电脑配置theano
- 将pdf文件转换成jpg图片
- 如何提高工作效率
- 一个鼓,左右手轮流敲打。
- Problem A
- iOS开发中的一些常用方法
- 浅谈MVP实现Android应用层开发
- LA 3401 Colored Cubes
- Android工程师应该具备的四大开发习惯
- Android 设计模式之单例模式
- jsp自定义标签实例
- php 类中调用另一个类