Android(Java)Producer / Consumer with Timer

时间:2011-08-16 02:31:13

标签: android multithreading concurrency producer-consumer

我在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;

}

该程序一直运行到随机点。有时对于几个minuites它可以正常运行,消费者从生产者那里读取等等。但是,每次,在某个时刻,程序只会在生产者和消费者处冻结一定值(每次随机)。有没有人看到上述代码有问题?

2 个答案:

答案 0 :(得分:2)

您应该使用blocking queue以更有效和易于理解的方式在生产者 - 消费者线程之间进行通信。

答案 1 :(得分:0)

你应该使用notifyAll()。 notify不保证通知哪个线程。另外,检查hat empty实际上是同步的(即由get和put驻留的状态类所拥有。)。