2016-01-06 77 views
3

我在Java創建停車場,我有一個入口和一個出口。停車場有20個車位,而且我認爲我已經正確編碼了入口/出口,我被要求使用線程。Java中的停車場,遞減空間

import java.io.*; 

public class CarPark { 
    private int spaces; 

    public CarPark(int spaces) 
    { 
     if (spaces < 0) { 
      spaces = 0; 
     } 

     this.spaces = spaces; 
    } 

    public synchronized void entrance() //enter car park 
    { 
     while (spaces == 0) { 
      try { 
       wait(); 
      } catch (InterruptedException e) 
      { 

      } 
     } 
     spaces --; 
    } 

    public synchronized void exit() // exit car park 
    { 
     spaces++; 
     notify(); 
    } 
} 

我停留在如何表示實際的停車庫本身,並創建可自動增加或減少作爲汽車接近或離開的空間只是有點。我已經編寫了以下迄今爲止的主要方法:

public static void main(String[] args){  
    CarPark parkingGarage = new CarPark(20); //20 spaces  
} 

而且當位已滿,汽車需要排隊的空間,這將是最好的表示這是一個整數,我認爲。 你可能會認爲汽車不能同時進入和離開(即系統會因鎖定而發生這種情況)

最終我需要將它變成客戶機 - 服務器系統。

任何意見,非常感謝!

+1

你所做的一切似乎罰款。嘗試創建兩個線程 - 一個定期重複調用入口方法的線程,另一個定期重複調用exit方法。在出口和入口方法中打印CarPark的內容並運行你的代碼,看看它是如何工作的。 –

+0

雖然你可能無法使用它(因爲你必須編寫較低級別的線程代碼),但Semaphore旨在幫助你在這種情況下(許可證的概念,獲取,發佈) –

+0

@AndyTurner我看到了死鎖,然而我正在努力的規範將鎖定作爲一項要求。 – collision934

回答

1

你到目前爲止所做的工作對我來說看起來還好。您只需使用CarPark對象'parkingGarage'來模擬進入或退出的汽車。

例如:

parkingGarage.entrance(); 

這將模擬汽車進入車庫,因此空間會減小。

同樣,.exit()會做同樣的事情,但增加的空格數。儘管您需要添加檢查以確保只有在發生入口時才能進行退出。例如,你不能有10個入口和20個出口,並且空間的數量會變成負數。

此外,你也可以實現某種形式的「排隊」的,這樣,當沒有空間,車內等待時間最長將首先得到一個空間。

線程可以讓你「同時」運行的代碼位,你可以請進一步說明它是什麼正是你想要/正在嘗試做的。

編輯:

閱讀阿克沙伊的評論後,茅塞頓開我。就像他們說的那樣,你可以創建兩個線程,一個處理入口,一個處理出口,並且每個線程在下一輛車進入或退出之前產生一個隨機時間。你可以這樣做:

Thread.sleep(randomAmountOfTime) 

注意:這個參數是以毫秒爲單位處理的。再次記下我以前的觀點:沒有比入口更多的出口。

在此之後,你可以打印出某種日誌,輸出一個消息當汽車退出或進入,甚至有一個動態的「符號」,這顯示自由空間,當汽車進入或退出這將改變數。

希望這會有所幫助。

+0

謝謝你,我猜我應該使用數組來確保有超過20輛車?但是,我不能確定,邏輯和代碼,汽車將如何排隊,我知道我可以把它表示爲一個整數,但我不確定如何讓入口明白有一個隊列。 – collision934

0

我覺得你的代碼和邏輯是很好.. 我有一些suggessions,

  1. 使用多個入口和汽車出口門,讓您的系統將成爲先進的一個
  2. 使用ArrayList的概念,這樣就可以dynamicaly增加限制爲您的汽車的數量。 我這個特殊的代碼你只用了20輛車。
+0

儘管你的積分可能是有效的,但這並不能以任何方式回答實際問題,而只是一個答案。我建議你提出更好的問題或回答其他一些問題,以獲得評論帖子的聲譽。 – YoungHobbit

+0

@Akhi Youngisthan我可以選擇採用先進的方式,但我非常喜歡簡單的版本。此外,數組列表並不是一個壞主意,因爲我需要超過20輛汽車。 – collision934

1

我的意見是每個線程應該代表一輛車。所以,我會在主線程進入一個循環:

for (;;) { 
    Thread.sleep(randomAmountOfTime); 
    // a new car has shown up 
    spawn a new carThread 
} 

每節車廂線程會是這樣的:

System.out.println("Car " + carId + " has arrived"); 
parkingGarage.entrance(); 
System.out.println("Car " + carId + " has parked"); 
Thread.sleep(randomAmountOfTime); 
parkingGarage.exit(); 
System.out.println("Car " + carId + " has left");