Java 未来实例列表

Java 未来实例列表,java,concurrency,guava,future,executorservice,Java,Concurrency,Guava,Future,Executorservice,我想用更高性能的东西来替换未来实例的列表。目前,我正在遍历一棵树,并提交一个可调用函数,以确定树中每个节点的后代或自身节点数。我将在列表中保存未来实例,然后在需要时从列表中获取适当的节点数: try { assert mIndex + 1 < mDescendants.size(); mItem = Item.BUILDER.set(mAngle, mExtension, mIndexToParent).setParentDescendantCount(

我想用更高性能的东西来替换未来实例的列表。目前,我正在遍历一棵树,并提交一个可调用函数,以确定树中每个节点的后代或自身节点数。我将在列表中保存未来实例,然后在需要时从列表中获取适当的节点数:

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);
}
然后在doHasNext()中:

试试看{
断言mIndex+1
听众:

/** {@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();
    }
}
/**{@inheritDoc}*/
@抑制警告(“未选中”)
@凌驾
公共无效属性更改(最终属性更改事件参数){
对象。requirennull(参数);
if(“后代”.equals(parametent.getPropertyName())){
添加((未来)参数.getNewValue());
mLatch.countDown();
}
}
我不确定它是否有效,太迟了,我不相信我使用Countdownlack的方式(还没有测试上面的代码)

编辑:以防万一有人感兴趣。我现在不再使用CountDownLatch和列表,而是简单地将BlockingQueue与PropertyChangeListener的实现结合使用,这似乎是一个很好的“干净”解决方案

问候,


约翰

你就不能用一把枪吗?一旦提交,它将处理第一个将来要完成的任务…

我对您提交的代码不太了解(Item.BUILDER做什么?),但是,如果您的列表太大,无法放入内存,一个可能的解决方案是重写代码以使用iterables/迭代器,然后动态处理您的项目。Guava在com.google.common.collect.Iterables和com.google.common.collect.Iterators中有许多实用方法可以帮助实现这一点。“功能实例”->你是指未来实例,对吗?不,我需要它们,这就是为什么我认为这是使用观察者模式和阻塞队列的最佳方式。它只是一根管子什么的,显然更快。现在,我只需要替换另一个瓶颈,即在所有项目生产完成后触发更改,这是浪费时间的。如果您需要按特定顺序完成更改,它们不只是串行的吗?为什么不依次等待每个未来呢?影响与使用观察者相同否?再简单一点。。?我建议提交作业不应该是一个巨大的开销,它很可能会被等待每个作业完成的时间所压倒。这似乎对较大的树(特别是1MB及以上的树——如果你可能认为它是一个较大的树)产生了巨大的影响。显然,它的伸缩性更好,因为即使对于大约2000个节点,树的遍历和提交似乎也会持续2到3秒,但我还没有对其进行基准测试。由于这种流水线方法加快了整个过程:-)您的意思是调用submit需要2秒钟的时间来完成提交所需的对象构造/准备工作吗?不,是通过树的整个迭代来提交每个节点的可调用项。
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();
    }
}