生产者/消费者线程并发Java

时间:2014-09-08 19:31:18

标签: java multithreading concurrency thread-safety rmi

我有一个生产产品的生产者和消费它们的消费者。我想要的是,如果产品在5分钟内没有被消耗,我希望它被销毁。

这是制作人的一部分:

boolean full = false;
public void produce(int p) throws RemoteException {
        //choses a or b randomly 
        //if a or b spot is occupied, thread must wait()

        synchronized(this){
            if ((int)((Math.random()*10)%2) == 1){
                while (a!=-1){try {
                        wait();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(CHServer.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                a = p;
                if (b!=-1) full = true;
                notifyAll();
            }
            else {
                while (b!=-1){try {
                        wait();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(CHServer.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                b = p;
                if (a!=-1) full = true;
                notifyAll();
            }
        }
    }

a& b应该是我的产品。

我真的不知道如何衡量时间,例如线程在等待或客户端没有尝试使用该产品时。这段代码在RMI java服务器上运行。

2 个答案:

答案 0 :(得分:2)

我只是使用这样的方案:当你生成一些东西时,使用java.util.Timer()来设置未来5分钟的计时器。消耗该项目时,.cancel()计时器。如果计时器熄灭,请执行您需要进行的清理工作。

答案 1 :(得分:1)

看起来你正在实现一个有2个插槽的队列,2个插槽是a和b。但是选择随机时段的策略并不是最优的。您可能在另一个空的时候等待一个插槽。此外,消费者无法分辨出您生产的a或b中的哪一个。

无论如何,如果我能很好地理解代码,你可以

  1. 保存您进入循环时的当前时间。
  2. 每次从wait()唤醒时,计算自条目以来的延迟。如果超过了您的时间限制,则返回或抛出异常。否则,请检查插槽是否可用。
  3. 为了确保不要永远等待,你应该指定等待的延迟。你可以等一个固定的时间,也许是1秒,或者计算剩下的等待时间,直到5分钟的截止日期。