Я такой кода:Есть ли лучший способ использовать ожидание/оповещать связи с AtomicInteger
public class RecursiveQueue {
//@Inject
private QueueService queueService;
public static void main(String[] args) {
RecursiveQueue test = new RecursiveQueue();
test.enqueue(new Node("X"), true);
test.enqueue(new Node("Y"), false);
test.enqueue(new Node("Z"), false);
}
private void enqueue(final Node node, final boolean waitTillFinished) {
final AtomicLong totalDuration = new AtomicLong(0L);
final AtomicInteger counter = new AtomicInteger(0);
AfterCallback callback= new AfterCallback() {
@Override
public void onFinish(Result result) {
for(Node aNode : result.getChildren()) {
counter.incrementAndGet();
queueService.requestProcess(aNode, this);
}
totalDuration.addAndGet(result.getDuration());
if(counter.decrementAndGet() <= 0) { //last one
System.out.println("Processing of " + node.toString() + " has finished in " + totalDuration.get() + " ms");
if(waitTillFinished) {
counter.notify();
}
}
}
};
counter.incrementAndGet();
queueService.requestProcess(node, callback);
if(waitTillFinished) {
try {
counter.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Imagine есть queueService
, который использует блокировку очереди и несколько потребительских потоков для обработки узлов = вызывает DAO для получения дочерних узлов (это дерево). Таким образом, метод requestProcess
просто обводит узел и не блокирует его.
Есть ли лучший/безопасный способ избежать использования wait/notify в этом примере? Согласно некоторым выводам, я могу использовать Phaser (но я работаю над java 6) или условиями (но я не использую блокировки).
Не совсем так, как это требует предварительного знания узлов, подлежащих обработке, и это знание может быть получено только путем обработки родительских узлов. –