2014-05-11 3 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, которому была дана ссылка . Метод разблокировки должен возвращаться при открытии SecretChest. SecretChest не следует открывать до тех пор, пока нулевое число не должно быть вызвано нулевым числом потоков KeyHolder. Требуемое количество требуемых ключей необходимо указать в командной строке .

Как можно заметить, выход из программы, 3 Брелки является:

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; 

} 

Но я не думаю, что это, Что спрашивают о, вопрос просит использовать Javas Object Мониторы ... есть другой способ сделать это? Я связал, используя 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

Уже плохо, что Володя сделал ваш HW. Теперь вы хотите, чтобы он объяснил это вам? Как насчет того, если вы сделаете свою часть и, по крайней мере, попытаетесь отладить ее? –

+0

Извиняюсь, я получил эту работу самостоятельно (я должен был включить код) с кодом ниже, но я не думаю, что то, что задает вопрос ... Мне нужно использовать объектные мониторы, и вот где я боюсь. keysStillRequired--; \t \t синхронизированный (это) { if (keysStillRequired == 0) \t { return true; } return false; – user3626100

Смежные вопросы