【问题标题】:Producer/Consumer Threads Concurency Java生产者/消费者线程并发 Java
【发布时间】:2014-09-08 19:31:18
【问题描述】:

我有一个生产产品的生产者和一个消费产品的消费者。我想要的是,如果一个产品在 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 服务器上运行。

【问题讨论】:

    标签: java multithreading concurrency thread-safety rmi


    【解决方案1】:

    我只是使用这样的方案:当您生产某些东西时,使用java.util.Timer() 将计时器设置为未来 5 分钟。当物品被消耗时,.cancel() 计时器。如果计时器响起,请执行您需要做的任何清理工作。

    【讨论】:

    【解决方案2】:

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

    无论如何,如果我理解代码,你可以

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

    【讨论】:

      猜你喜欢
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 2014-10-13
      • 2013-11-17
      • 2014-01-01
      • 1970-01-01
      相关资源
      最近更新 更多