簡體   English   中英

生產者/消費者線程並發性Java

[英]Producer/Consumer Threads Concurency Java

我有一個生產產品的生產者和一個消費它們的消費者。 我想要的是,如果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()計時器。 如果計時器關閉,請執行所需的任何清理操作。

看來您正在實現一個具有2個插槽的隊列,這2個插槽是a和b。 但是選擇隨機時隙的策略並不是最佳的。 您可能需要等待一個插槽,而另一個插槽為空。 而且,消費者無法分辨您是先生產a還是b中的哪個。

無論如何,如果我對代碼理解得很好,您可以

  1. 在進入循環時保存當前時間。
  2. 每次您從wait()喚醒時,請計算自輸入以來的延遲。 如果超過您的時間限制,請返回或引發異常。 否則,檢查插槽是否可用。
  3. 為了確保不會永遠等待,您應該指定等待時間。 您可以等待一個固定的時間(可能是1秒),或者計算直到5分鍾的截止時間為止的剩余等待時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM