一个鼓,左右手轮流敲打。
2016-07-05 11:42
316 查看
这题应该算可以考虑成生成消费模型,左手生产,右手消费。但是右手敲完了,左手又成了消费者。
可以考虑使用一个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++));
}
}
}
可以考虑使用一个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++));
}
}
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树