2011-04-20 84 views
0

嘿大家,我有一個任務在學校表演,真的不知道如何開始。 我不想要整個解決方案,而是提示以及如何開始使用。對不起,但我是編程新手。這裏的任務:使用信號量和共享變量進行Java編程

公告板(40p)用於張貼公寓租金公告。每份租賃通知都包含3個帶有電話號碼的可撕式標籤。一羣n學生掃描尋找公寓的董事會。每個學生隨機選擇3個不同的公寓,並嘗試從3個相應的通知中刪除一個標籤。如果學生成功選擇了他/她選擇的3個選項卡,他/她將離開,否則他/她不會佔用任何時間,隨機停留一段時間,然後再次嘗試選擇3個不同的公寓。當所有學生都離開時,模擬結束。假設董事會有空間進行綜合報告(n/3)通知。開發一個並行程序,模擬學生僅使用信號進行同步的動作。將學生表示爲併發進程。務必聲明並初始化您用於進程交互和同步的共享變量。嘗試最大化併發。馬上解釋你的解決方案是如何工作的以及它如何避免死鎖。


更新包括爲答案提供信息

這裏是我到目前爲止的代碼!我在正確的方向!?

private static Semaphore[] apartments; 

public void setApartments() 
{ 
    apartments = new Semaphore[3]; 
    for(int i = 0; i < 3; i++) 
     apartments[i] = new Semaphore(3); 
} 

@Override 
    public void run() 
    { 
     setApartments(); 
     Random random = new Random(); 

    while(counter < 3) 
    { 
     try 
     { 
      acquired = apartments[random.nextInt(3)].tryAcquire(); 
      if(acquired) 
       System.out.println("Student" + id + " succeded."); 
      else 
       System.out.println("Student" + id + " failed."); 

      counter++; 
     } 
     catch(Exception e) {e.printStackTrace();} 
    } 
} 

我有一個問題,我不明白。 我有4個線程在同一時間運行,一次說一個許可證: 靜態信號標籤A =新的信號量(3);

所以我的線程將永遠運行的原因,它沒有得到任何。但如果我使用tabsA.release();當線程不符合要求時,即使在Semaphore(3)中有3個許可證時,所有四個線程都可以獲得許可證。我甚至可以跑10次,它會起作用。怎麼來的?

+0

你需要使用這個:http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html,據推測 – 2011-04-20 18:11:00

+0

因此,考慮到課程講座和書籍/參考信息,**解釋如何接近解決方案的一些想法/想法/算法。在這個大綱中不需要任何Java特定的東西 - 只需使用類(和「僅使用信號量」)中講授的並行/併發概念。 – 2011-04-20 18:12:27

回答

0

我會建議連續編寫這個(即一次一個學生),以使您的基本對象/方法/算法正常工作。這對你來說應該相對簡單。然後在開始重構並行性並回答相關問題時再回來。

+0

那麼一個許可證對應一個通知? – Christian 2011-04-22 12:07:13

0

一種方法可能是將每個租借通知表示爲具有Semaphore可用選項卡的數量。

信號量基本上是一種聲明存在有限數量資源的方式。當一個進程試圖獲得一個信號量時,它基本上要求一個許可證來使用Semaphore象徵性地守護的資源。當獲得許可證的流程與資源一起完成時,它應該釋放許可證,以便另一個流程可以獲得該許可證。如果一個進程想要等待(可能永遠)許可證在Java中可用,它會調用Semaphore.acquire()。如果一個進程試圖獲得一個許可證,如果它立即可用或者做別的事情,那麼在Java中調用Semaphore.tryAcquire()

1

作爲一個規則,我不喜歡直接回答功課的問題,但你可能要集中你的研究Random類及其nextInt(int)法,List<T>接口和它的實現中,Runnable接口(和Thread類) ,Semaphore類及其tryAcquire()release()方法)。

+0

只要確保你不要調用信號量的'release()'方法,除非你真的設法首先從它獲得許可證......(我以前從來沒有犯過這樣的錯誤或任何事情!*無辜的口哨*) – Powerlord 2011-04-20 18:25:04

+0

終於{釋放許可}在這裏使用{獲取許可} :) – 2011-04-20 18:27:06

+0

@ChrisDennett:呃,根據這個應用程序的規格,你只想發佈許可證,如果你不能收集所有三個隨機選擇的。 – Powerlord 2011-04-20 19:09:05