Я хотел бы заменить Список будущих экземпляров чем-то более производительным.В настоящее время я перебираю дерево и отправляю Callable, чтобы определить количество узлов-потомков для каждого узла в дереве.Я сохраняю экземпляр Future в List, а затем получаю необходимое количество узлов из List:
try {
assert mIndex + 1 < mDescendants.size();
mItem =
Item.BUILDER.set(mAngle, mExtension, mIndexToParent).setParentDescendantCount(
mParDescendantCount).setDescendantCount(mDescendants.get(mIndex + 1).get()).build();
} catch (final InterruptedException | ExecutionException e) {
LOGWRAPPER.error(e.getMessage(), e);
}
Печально, что ось, использующая List, должна ждать, покавсе будущие экземпляры были представлены.Более того, он не масштабируется за пределы основной памяти: - /
Может быть, Google Guava и ListenableFuture - это то, что вам нужно.
Редактировать: Теперь я думаю, что на самом деле я что-то создаю сPropertyChangeListener, где фьючерсы добавляются в список при каждом срабатывании Future.Затем я запускаю CountDownLatch в 1 и вызываю countDown () каждый раз, когда в список добавляется новое будущее.Что-то вроде:
/**
* {@inheritDoc}
*/
@Override
public boolean hasNext() {
if (mDescendants.size() > 0) {
return doHasNext();
} else {
try {
mLatch.await(5, TimeUnit.SECONDS);
} catch (final InterruptedException e) {
LOGWRAPPER.error(e.getMessage(), e);
}
return doHasNext();
}
}
, затем в doHasNext ():
try {
assert mIndex + 1 < mDescendants.size();
mItem =
Item.BUILDER.set(mAngle, mExtension, mIndexToParent).setParentDescendantCount(
mParDescendantCount).setDescendantCount(mDescendants.get(mIndex + 1).get()).build();
mLatch = new CountDownLatch(1);
} catch (final InterruptedException | ExecutionException e) {
LOGWRAPPER.error(e.getMessage(), e);
}
и слушателе:
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override
public void propertyChange(final PropertyChangeEvent paramEvent) {
Objects.requireNonNull(paramEvent);
if ("descendants".equals(paramEvent.getPropertyName())) {
mDescendants.add((Future<Integer>) paramEvent.getNewValue());
mLatch.countDown();
}
}
Я не уверен, что это работает, этослишком поздно, и я не доверяю тому, как я использовал бы CountDownLatch (не проверял вышеуказанный код).
Редактировать: На всякий случай, если кому-то это интересно.Вместо CountDownLatch и List я теперь просто использовал BlockingQueue в сочетании с реализацией PropertyChangeListener, который представляется хорошим, «чистым» решением.
regards
Johannes