生产者/消费者 - 具有指定间隔的实时场景

时间:2018-01-23 13:32:55

标签: java android multithreading

USECASE:

1.有一个队列从另一个源异步填充。

2.需要一个接一个地使用该队列中的数据。有一个用例(播放声音),当队列中有多个元素时,队列中的数据提取应该每隔X秒发生一次。

以下是该示例代码段:

    Queue<Wrapper> q = new ConcurrentLinkedQueue<>();
    // filling up queue
    void add(A obj) {    
    synchronized (q) {
      q.add(obj);
      q.notify();
      }
     }

以下是用于提取数据的消费者代码:

    class Consumer extends Thread {
    @Override
    public void run() {
        while ( true ) {
            try {
                synchronized ( q ) {
                    while ( q.isEmpty() )
                        q.wait();

                    // Get the  item off of the queue
                    A w = q.remove();
                    // Process the work item
                    playSomeSoundForXsec(w);
                    Thread.sleep(3000);
                }
            }
            catch ( InterruptedException ie ) {
                break; 
            }
        }
    }

}

上述代码的问题:

  1. 静态代码分析错误: 在持有锁时,应使用wait(..)代替“Thread.sleep(..)

  2. 当连续事件填满队列时,声音就会停止响起。

  3. 处理上述用例的更好方法。

0 个答案:

没有答案