Список будущих экземпляров - PullRequest
1 голос
/ 03 сентября 2011

Я хотел бы заменить Список будущих экземпляров чем-то более производительным.В настоящее время я перебираю дерево и отправляю 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

1 Ответ

2 голосов
/ 04 сентября 2011

Разве вы не можете просто использовать услугу завершения ?После отправки будет обработано первое будущее для завершения ...

...