我正在 android 中测试一个简单的生产者/消费者示例,这就是我正在做的。
我有两个 EditText 框,一个是生产者,另一个是消费者。该应用程序还有一个按钮,一旦按下此按钮,两个计时器就会启动,生产者生产,而消费者消费。这是我的代码:
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Timer producerTimer = new Timer();
producerTimer .schedule(new TimerTask(){
@Override
public void run(){
producer();
}
},100, 300);
Timer consumerTimer = new Timer();
consumerTimer .schedule(new TimerTask(){
@Override
public void run(){
consumer();
}
},100, 300);
}
});
}
现在介绍其他方法:
public void producer(){
this.runOnUiThread(producer_Tick);
}
public void consumer(){
this.runOnUiThread(consumer_Tick2);
}
private Runnable producer_Tick = new Runnable(){
public void run(){
put(i++);
}
};
private Runnable consumer_Tick= new Runnable(){
public void run(){
int result = get();
consumerBox.append(Integer.toString(result) + "\n");
}
};
这是我的同步方法:
public synchronized void put(int val){
if (!empty){
try{
wait();
}catch (InterruptedException e) {Log.d(TAG,"Error Putting");}
}
producerBox.append(Integer.toString(val) + "\n");
empty = false;
buffer=val;
notify();
}
public synchronized int get(){
if (empty){
try{
wait();
}catch (InterruptedException e) {Log.d(TAG,"Error getting");}
}
empty = true;
notify();
return buffer;
}
这个程序一直运行到随机点。有时,在消费者从生产者那里读取等信息时,它运行良好。但是,每次,在某个时候,程序只会在生产者和消费者处卡住在某个值(每次都是随机的)。有人看到上面的代码有问题吗?
最佳答案
你应该使用 blocking queue以更高效和易于理解的方式在生产者-消费者线程之间进行通信。
关于带定时器的 Android(Java) 生产者/消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7073022/