这题应该算可以考虑成生成消费模型,左手生产,右手消费。但是右手敲完了,左手又成了消费者。
可以考虑使用一个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;
}
public static class BitMode {
volatile boolean isexit;
volatile boolean 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++));
}
}
}