2012-11-18 50 views
1

我目前停留在一個點功課,並想知道是否有人能幫助 -的Java信號量syncronize印刷篩選

我必須使用信號量在Java中印字母從2個線程同步 - 一個打印「 A「和一個打印」B「。我不能打印出超過2連續相同的字符,所以輸出應該看起來像

AABABABABABBABABABABAABBAABBABABA

目前,我有3個信號燈,二進制互斥設置爲1,和信號計數,和我的線程類是這個樣子 -

public void run() { 
    while (true) { 
     Time.delay(RandomGenerator.integer(0,20)); 
     Semaphores.mutex.down(); 
     System.out.println (produce()); 

      if (printCount > 1) 
      { printCount = 0; 
       Semaphores.mutex.up(); 
       Semaphores.printB.up(); 
      } 
    } 
} 
public String produce() { 
    printCount++; 
    return "A"; 
} 


public void run() { 
    while (true) { 
     Time.delay(RandomGenerator.integer(0,20)); 
     Semaphores.mutex.down(); 
     System.out.println (produce()); 

      if (printCount > 1) 
      { printCount = 0; 
       Semaphores.mutex.up(); 
       Semaphores.printA.up(); 
      } 
    } 
} 
public String produce() { 
    printCount++; 
    return "B"; 
} 

但無論我嘗試,要麼死鎖,或它似乎是唯一的工作最多打印2連勝,但似乎總是在打印3每隔一排又一排!

任何幫助非常感謝,不看代碼或任何東西只是幾個指針如果可能的話:)

+0

雖然這不符合要求,但您可以使用Peterson算法實現此目的。 – nhahtdh

+0

將不會如果條件總是正確的? – twodayslate

+0

一旦printCount大於1,我將它重置爲0,以便它可以重新開始,在produce()方法中 –

回答

2

你似乎是設置printA和printB信號燈起來而沒有設定下來。如果他們試圖成立多次,他們會自己等待。


要回答「我會在哪裏設置它們?」的評論?

我不太確定,說實話。我能想象的唯一的事情是,如果教授試圖利用這個事實(在java中),你可以釋放比最初獲得的信號更多的時間。

如果是這樣,那麼該模式將是兩個信號量,一個用於生產者'B'和一個用於生產者'B'。他們的每種生產方法都會根據自己的信號採集並釋放相對生產者的信號量。因此,信號計數是生產者沒有從其他生產者發佈相應版本而獲得的次數,但這種方法與信號量的概念意圖不一致,取決於Java特定的實現,只是徹頭徹尾的讓我感到不安。

我會盡早使用第三個管理器或使用者線程執行此操作,該線程執行限制或對共享整數使用互鎖操作。無論哪種方式,不使用信號量。如果我們希望確保只有三個短暫的生產者自主執行信號量,它將會很有用。

+0

我將在哪裏調用?我有 Semaphores.mutex.down(); System.out.println(produce());如果(printCount> 1) {printCount = 0; } Semaphores.mutex.up(); Semaphores.printB.up(); Semaphores.printA.down(); } Semaphores.mutex.up(); 但它仍然設法打印出3連續出於某種原因 –