我有一个生产产品的生产者和消费它们的消费者。我想要的是,如果产品在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服务器上运行。
答案 0 :(得分:2)
我只是使用这样的方案:当你生成一些东西时,使用java.util.Timer()
来设置未来5分钟的计时器。消耗该项目时,.cancel()
计时器。如果计时器熄灭,请执行您需要进行的清理工作。
答案 1 :(得分:1)
看起来你正在实现一个有2个插槽的队列,2个插槽是a和b。但是选择随机时段的策略并不是最优的。您可能在另一个空的时候等待一个插槽。此外,消费者无法分辨出您生产的a或b中的哪一个。
无论如何,如果我能很好地理解代码,你可以