2014-05-11 59 views
-1

尋找一些幫助與大學作業,真的堅持這一個,會感謝一些幫助...是同步嗎?Java對象監視器

考慮如下所示的代碼:

public class Q3 { 

public static void main(String args[]) { 
    new Q3(Integer.parseInt(args[0])); 
} 

public Q3(int keyholdersRequired) { 
SecretChest secretChest = new SecretChest(keyholdersRequired); 
for(int i = 0; i < keyholdersRequired; i++) { 
new KeyHolder(secretChest).start(); 
try { 
Thread.sleep((int)(Math.random() * 5000)); 
} catch (InterruptedException ie) {} 
} 
} 
} 

class KeyHolder extends Thread { 

private SecretChest secretChest; 

public KeyHolder(SecretChest secretChest) { 
this.secretChest = secretChest; 
System.out.println("New Keyholder Arrived..."); 
} 

public void run() { 
if(secretChest.unlock() == true) 
System.out.println("Secret chest unlocked"); 
} 
} 

class SecretChest { 

private int keysStillRequired; 

public SecretChest(int keysRequired) { 
keysStillRequired = keysRequired; 
} 

public boolean unlock() { 
keysStillRequired--; 
return true; 
} 

} 

在這個程序中,新KeyHolder線程間歇啓動。然後,每個KeyHolder都會調用SecretChest上的解鎖方法, 已被給予參考。解鎖方法應在打開時返回 SecretChestSecretChest不應該打開,直到 所需的線程號碼KeyHolder稱爲解鎖方法。 所需的KeyHolders數量作爲命令行 參數傳遞給程序。

既然這樣,從該程序的輸出,對於3個KeyHolders是:

java Q3 3 
New Keyholder Arrived... 
Secret chest unlocked 
New Keyholder Arrived... 
Secret chest unlocked 
New Keyholder Arrived... 
Secret chest unlocked 

所需的輸出是:

java Q3 3 
New Keyholder Arrived... 
New Keyholder Arrived... 
New Keyholder Arrived... 
Secret chest unlocked 
Secret chest unlocked 
Secret chest unlocked 

使用Java的對象監視器,使向SecretChest必要的修改 上面的類來產生所需的行爲。

我得到這個使用

class SecretChest { 

private int keysStillRequired; 

public SecretChest(int keysRequired) { 
keysStillRequired = keysRequired; 
} 

public boolean unlock() { 
    keysStillRequired--; 

if(keysStillRequired == 0) { 
return true; 
} 

return false; 

} 

但我不認爲這是什麼被要求,這個問題要求使用Java類對象監視器...有另一種方式來做這項工作呢?我綁定使用syncronise和通知,但我不知道如何使用它們。

欣賞的幫助。

回答

0

那是因爲你沒有做與keysStillRequired

什麼

應該遞減,並且...

0

這裏是你的代碼:

public class Q3 { 

    public static void main(String args[]) { 
     new Q3(Integer.parseInt("3")); 
    } 

    public Q3(int keyholdersRequired) { 
     SecretChest secretChest = new SecretChest(keyholdersRequired); 
     for (int i = 0; i < keyholdersRequired; i++) { 
      new KeyHolder(secretChest).start(); 
      try { 
       Thread.sleep((int) (Math.random() * 5000)); 
      } catch (InterruptedException ie) { 
      } 
     } 
    } 
} 

class KeyHolder extends Thread { 

    private SecretChest secretChest; 

    public KeyHolder(SecretChest secretChest) { 
     this.secretChest = secretChest; 
     System.out.println("New Keyholder Arrived..."); 
    } 

    public void run() { 
     secretChest.unlock(); 
     System.out.println("Secret chest unlocked"); 
    } 
} 

class SecretChest { 

    private int keysStillRequired; 

    public SecretChest(int keysRequired) { 
     keysStillRequired = keysRequired; 
    } 

    public boolean lock() { 
     return keysStillRequired > 0; 
    } 

    public synchronized void unlock() { 
     keysStillRequired--; 
     // for last thread this condition gives false 
     if (lock()) { 
      try { 
       // all threads except last are waiting here 
       super.wait(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     // the last thread wakes up all previous threads 
     super.notifyAll(); 
    } 
} 
+0

感謝,但你能解釋一下嗎? – user3626100

+1

Volodia做你的硬件已經很糟糕。現在你想讓他向你解釋一下嗎?如果你儘自己的本分並且至少嘗試通過它進行調試,那麼該如何? –

+0

道歉,我確實得到了這個工作(我應該包括代碼)與下面的代碼,但我不認爲這就是問題的要求...我需要使用對象監視器,那就是我掙扎。 keysStillRequired--; \t \t synchronized(this){ if(keysStillRequired == 0)\t { return true; } return false; – user3626100