私は次のようにObserver&Runnableを実装するクラスを持っています(この例は不器用かもしれないことを知っています):
public class Triage implements Observer,Runnable{
Observable obsrvbl;
private BlockingQueue<String> messages;
volatile static boolean interrupted=false;
double updated;
Triage(Observable obsrvbl, BlockingQueue messages){
this.obsrvbl=obsrvbl;
this.messages = messages;
obsrvbl.addObserver(this);
}
public void update(Observable o, Object arg){
updated += ((Double)arg).doubleValue();
System.out.println("updated");
}
public void run(){
String msg;
while(!interrupted){
msg=messages.take();
if(msg!=null){
//do something with message
}
}
}
}
ピークされているキューは、ObservableがnotifyObservers()を呼び出すと同時に入力されます。キューに何もない場合、update()はオブザーバーで正常に呼び出されますが、キューに処理するメッセージがある場合、update()は呼び出されません。これは予想される動作ですか?
私はこれを見ましたが、それは別の問題のようです。
そして、これがObservableです-やや工夫されています:
public class Producer extends Observable implements Runnable {
volatile static boolean interrupted=false;
private BlockingQueue<String> quotes;
Producer(BlockingQueue quotes){
this.quotes=quotes;
}
public void run(){
String msg;
while(!interrupted){
msg=quotes.take();
if(msg!=null){
setChanged();
notifyObservers(Double.valueOf(3.0));
}
}
}
}