Я тестирую простой пример производителя / потребителя в 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;
}
Эта программа работает со случайными точкамивсе время.Иногда в течение нескольких минут он работает нормально, когда потребитель читает данные от производителя и т. Д. Однако каждый раз, в какой-то момент, программа просто останавливается у производителя и потребителя с определенным значением (случайным образом каждый раз).Кто-нибудь видит проблему с приведенным выше кодом?