2010-10-18 3 views
4

Я работаю над заданием и должен создать два класса: один представляет человека, а другой представляет собой мост. Только один человек может «пересекать» мост в любой момент времени, но могут быть люди, ожидающие переходаJava, несколько потоков только с одним исполнением за один раз

Я легко реализовал это с многопоточным доступом, позволяющим нескольким людям пересекаться сразу, но у меня возникают проблемы, когда меняя его, чтобы можно было запускать только один поток ...

Моя основная проблема - дизайн класса, который они хотят, мне нужно начинать темы в классе person, но класс моста должен уметь ждать и уведомлять их для начала/остановки

Любые идеи, как я могу это сделать?

ответ

5

You вероятно, хотят читать на wait и notify , Есть учебники с поиском google.

Но после того как вы их немного поняли, вы хотите, чтобы объекты человека вызывали wait. Затем вы хотите, чтобы объект моста вызывал notify. Когда объект человека возвращается с wait, его очередь пересекать (как я понимаю вашу проблему.) Когда человек пересекает, объект моста снова вызовет notify.

Убедитесь, что вы правильно указали synchronize. Учебники должны помочь.

Прочитайте этот вопрос, а также: How to use wait and notify in Java?

0

Я верю, что задание просит вас использовать (или реализовать) мьютекс для доступа к совместно используемому ресурсу, иначе мосту. http://en.wikipedia.org/wiki/Mutex

2

Блокировка объекта как это:

// Bridge.java 

public class Bridge { 
private Object _mutex = new Object(); 

    public void cross(Person p) 
     synchronized(_mutex) { 
      // code goes here 
     }  
    } 
} 

Это один, вероятно, самый простой, способ ..

EDIT:

еще проще:

public class Bridge { 
    public synchronized void cross(Person p) 
    { 
     // code goes here 
    } 
} 
+0

Использование синхронизированного метода, по-видимому, является самым элегантным решением Java. Ассистент может увидеть [«Синхронизированные методы»] (http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html) для описания того, что он делает. Он не будет много рассказывать о семафорах или мьютексах/условиях, но это собственная ошибка преподавателя для выбора чего-то такого высокого уровня, как Java, чтобы преподавать что-то как низкоуровневое, как синхронизирующий доступ между несколькими потоками. –

0

Try java.util.concurrent:

http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executors.html#newSingleThreadExecutor%28%29

Этот класс Виль производить ExecutorService, где вы можете подать YOUT "Лица". И рабочие стоят в очереди, один Человек будет пересекать время.

+0

После того, как вы снова прочтете сообщение yout, я не уверен, если вы можете погладить свой дизайн, вам эти функции. –

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