生产者/消费者线程Concurrency Java

生产者/消费者线程Concurrency Java,java,multithreading,concurrency,thread-safety,rmi,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() synchroniz

我有一个生产产品的生产者和一个消费产品的消费者。我想要的是,如果一个产品在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.util.Timer()
设置未来5分钟的计时器。当物品被消费时,
.cancel()
会启动计时器。如果计时器关闭,请执行您需要执行的任何清理操作。

我只会使用这样的方案:当您生成某些内容时,请使用
java.util.timer()
将计时器设置为5分钟。当物品被消费时,
.cancel()
会启动计时器。如果计时器关闭,请执行您需要执行的任何清理操作。

我只会使用这样的方案:当您生成某些内容时,请使用
java.util.timer()
将计时器设置为5分钟。当物品被消费时,
.cancel()
会启动计时器。如果计时器关闭,请执行您需要执行的任何清理操作。

我只会使用这样的方案:当您生成某些内容时,请使用
java.util.timer()
将计时器设置为5分钟。当物品被消费时,
.cancel()
会启动计时器。如果计时器关闭,请执行您需要执行的任何清理。

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

不管怎样,如果我理解代码,你可以

  • 保存进入循环时的当前时间
  • 每次从wait()中醒来时,都要计算自进入后的延迟。如果超过了时间限制,则返回或抛出异常。否则,请检查插槽是否可用
  • 为了确保不要永远等待,您应该指定等待的延迟。您可以等待一个固定的时间,可能是1秒,或者计算剩余的等待时间,直到5分钟的最后期限

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

    不管怎样,如果我理解代码,你可以

  • 保存进入循环时的当前时间
  • 每次从wait()中醒来时,都要计算自进入后的延迟。如果超过了时间限制,则返回或抛出异常。否则,请检查插槽是否可用
  • 为了确保不要永远等待,您应该指定等待的延迟。您可以等待一个固定的时间,可能是1秒,或者计算剩余的等待时间,直到5分钟的最后期限

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

    不管怎样,如果我理解代码,你可以

  • 保存进入循环时的当前时间
  • 每次从wait()中醒来时,都要计算自进入后的延迟。如果超过了时间限制,则返回或抛出异常。否则,请检查插槽是否可用
  • 为了确保不要永远等待,您应该指定等待的延迟。您可以等待一个固定的时间,可能是1秒,或者计算剩余的等待时间,直到5分钟的最后期限

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

    不管怎样,如果我理解代码,你可以

  • 保存进入循环时的当前时间
  • 每次从wait()中醒来时,都要计算自进入后的延迟。如果超过了时间限制,则返回或抛出异常。否则,请检查插槽是否可用
  • 为了确保不要永远等待,您应该指定等待的延迟。您可以等待一个固定的时间,可能是1秒,或者计算剩余的等待时间,直到5分钟的最后期限

  • 你能举个例子吗?干杯,获取有关玩游戏的信息Timers@ExceptionCaught计时器可能会工作,但现在更好。参见课堂文档中的注释。你能举个例子吗?干杯,获取有关玩游戏的信息Timers@ExceptionCaught计时器可能会工作,但现在更好。参见课堂文档中的注释。你能举个例子吗?干杯,获取有关玩游戏的信息Timers@ExceptionCaught计时器可能会工作,但现在更好。参见课堂文档中的注释。你能举个例子吗?干杯,获取有关玩游戏的信息Timers@ExceptionCaught计时器可能会工作,但现在更好。参见课堂文档中的注释。