Вид Rendez-Vous на Java, который не работает - PullRequest
2 голосов
/ 20 января 2012

У меня проблемы с использованием wait() и notify().Мне нужно что-то вроде rendez-vous .

В небольшом фрагменте кода вот что:4 темы говорят "эй, я готов", прежде чем запустить конец someMethod().Но wait() длится вечно, несмотря на notifyAll().

Я не понимаю, как

Ответы [ 4 ]

6 голосов
/ 20 января 2012

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

Вам следует использовать механизм параллелизма более высокого уровня, например CountDownLatch. Вы хотели бы использовать CountDownLatch со значением 4. Пусть каждый из потоков вызывает метод countDown() фиксатора, а тот, который вы хотите подождать, вызывает await().

private CountDownLatch rendezvousPoint = new CountDownLatch(4);

//wait for threads
rendezvousPoint.await();

//do stuff after rendezvous

//in the other 4 threads:
rendezvousPoint.countDown();
3 голосов
/ 20 января 2012

Хм ... я единственный, кто заметил, что вы на самом деле не запускаете какие-либо потоки?

    new Runnable() {
        public void run() {
            A a = new A(rdv);
            a.someMethod();
        }
    }.run();

должно быть

 Thread t = new Thread(
    new Runnable() {
        public void run() {
            A a = new A(rdv);
            a.someMethod();
        }
    });
 t.start();

И это должно выполняться 4 раза, еслиВы хотите, чтобы 4 темы ожидали.

2 голосов
/ 20 января 2012

Вместо того, чтобы связываться с wait() и notify() самостоятельно, рассмотрите возможность использования CountDownLatch

1 голос
/ 20 января 2012

Конечно, это не будет достигнуто, потому что каждый экземпляр класса A имеет свой экземпляр класса Rdv;

Вам необходимо использовать RDV в качестве статической переменной в классе A

...