2012-06-08 3 views
0

Для моей домашней работы я должен сделать игру нескольких королей, перемещающихся по шахматной доске. Каждый король должен перейти от своего уникального начала к уникальной конечной позиции в своей нитке. Перед тем, как сделать свой ход, король должен спать до 10 миллисекунд (немного случайности), а затем ждать, пока другие сделают ход.Исключить конкретную тему от CyclicBarrier

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

Любые предложения?

+0

Невозможно напрямую выполнить то, что вы хотите, с помощью класса java.util.concurrent.CyclicBarrier. Возможно, вы сможете настроить логику королей, чтобы, однако, CyclicBarrier все же помогал вам. – Sbodd

+0

Рассматривали ли вы создание подкласса «CyclicBarrier» с помощью дополнительного метода - возможно, «ушел» был бы уместным - что просто порождает поток, который использует функции выходящего потока, просто «ждут» в цикле? Это, конечно, как я подхожу к этому. – OldCurmudgeon

ответ

1

Да. Используйте Phaser, который поставляется с Java 7. Это продвигаемый CycliclBarrier.

Чтобы имитировать CyclicBarrier напрямую, вы использовали бы Phaser таким образом.

Phaser phaser = new Phaser(n); 

public void doWorkAndAwait(){ 
    //work 
    phaser.arriveAndAwaitAdvance(); //await for all threads to arrive 
} 

Если вы хотите, чтобы уведомить Phaser вы приехали, но не ждать заранее вы просто arrive()

public void doWorkAndContinue(){ 
    //work 
    phaser.arrive(); 
    //stop own thread 
} 

На данный момент Phaser был уведомлен о том, что нить прибыла, но нить может stop own thread без необходимости ждать появления других потоков.

+0

Спасибо. Я посмотрю класс Phaser. Единственная проблема, с которой я вижу, это то, что она была представлена ​​на Java 7. К сожалению, я думаю, что наши помощники по-прежнему используют Java 6. –

+0

Нет проблем. Это позор, это выполнит именно то, что вы ищете. –

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