Я вижу, что вы сделали свой Семафор честным. Итак, я думаю, что вы заботитесь о порядке , эти "системные задачи" выполняются? Тогда полагаться на заказанные поступления нитей очень хрупко и опасно, на мой взгляд. Эта проблема также будет присутствовать, если вы используете ключевое слово synchronized
.
Я бы сказал, что вы должны использовать CountdownLatch
вместо этого.
class TaskOrganizer {
private final CountdownLatch firstTask = new CountdownLatch(1);
public void firstTaskIsDone(){
firstTask.countDown();
}
public void permissionForSecondaryTask(){
firstTask.await();
}
}
Если вы не можете передать TaskOrganizer
объекты в ваши потоки, тогда я думаю, что делать это статично - это нормально, но обычно лучше передавать экземпляры вашим потокам (ну, точнее, в Runnables). Вы никогда не знаете, если вам понадобятся 2 TaskOrganizer. Если бы вы использовали static
, то все будет не так чище, как могло бы быть.
Полагаю, это очевидно, но один поток вызывает firstTaskIsDone()
, а другой блокирует, пока это не будет сделано, вызывая permissionForSecondaryTask();
. Если у вас есть тонны задач для организации с тоннами потоков, вы можете развернуть Phaser
(запланировано появиться в JDK 7, бэкпорт доступен на http://gee.cs.oswego.edu/dl/concurrency-interest/).