Android (Java) Производитель / Потребитель с Таймером - PullRequest
1 голос
/ 16 августа 2011

Я тестирую простой пример производителя / потребителя в 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;

}

Эта программа работает со случайными точкамивсе время.Иногда в течение нескольких минут он работает нормально, когда потребитель читает данные от производителя и т. Д. Однако каждый раз, в какой-то момент, программа просто останавливается у производителя и потребителя с определенным значением (случайным образом каждый раз).Кто-нибудь видит проблему с приведенным выше кодом?

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Вы должны использовать очередь блокировки для более эффективной и простой для понимания связи между потоками производителя-потребителя.

0 голосов
/ 30 августа 2011

вы должны использовать notifyAll ().notify не гарантирует, какая нить уведомлена.Также проверьте, что пусто фактически синхронизировано (то есть принадлежит классу статуса, в котором находятся get и put.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...