带定时器的 Android(Java) 生产者/消费者

标签 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;

}

这个程序一直运行到随机点。有时,在消费者从生产者那里读取等信息时,它运行良好。但是,每次,在某个时候,程序只会在生产者和消费者处卡住在某个值(每次都是随机的)。有人看到上面的代码有问题吗?

最佳答案

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

关于带定时器的 Android(Java) 生产者/消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7073022/

相关文章:

android - ViewHolder - 良好实践

java - 强制 Android 媒体播放器在重新启动之前完成播放

c# - 创建和更新 UI 元素 Async Wpf

使用多个 CPU 内核的 javac

Java play框架 对同一对象的异步操作

android - RecyclerView 在打开软键盘时隐藏操作栏

我的应用程序的 Java 构造函数

java - 预定的 future 会导致内存泄漏吗?

java - 具有同步支持的自动增量数

python - master/worker 是否可扩展?