一个鼓,左右手轮流敲打。

来源:互联网 发布:核算成本的软件 编辑:程序博客网 时间: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++));

}

}

}



0 0
原创粉丝点击