【问题标题】:Foreach loop go to next iteration without waitng for current iterationForeach 循环进入下一次迭代而不等待当前迭代
【发布时间】:2013-09-30 19:50:41
【问题描述】:

在 foreach 循环中我调用了一个方法:

for (Iterable pl : ilist) {

myMethod();

}

myMethod() 对于当前(如几分钟或几天)p1 对象可能需要很长时间,但在执行时我想继续下一次迭代。(据我所知,这可以称为异步调用)

使用 foreach 循环是否也能做到这一点?

【问题讨论】:

  • 不,这是不可能的。你可以在这里使用线程 IMO。或者等待 Java-8,它将允许迭代的并行流。

标签: java asynchronous methods foreach


【解决方案1】:

如果您想安排这些任务异步完成,您可以创建一个新的 Runnable 并将其交给 ExecutorService 以在另一个线程上运行该操作。现在您需要知道如何处理此任务的结果。

// ExecutorService Thread Pool with 10 threads
ExecutorService executor = Executors.newFixedThreadPool(10);

public void iterate(Collection<?> collection) {
    for (Object o : collection) {
        executor.execute(createTask(o));
    }

}

public Runnable createTask(final Object o) {
    return new Runnable() {
        public void run() {
            // do task.
        }
    };
}

您将希望查看 Callable 和 Future 以变得更复杂。

【讨论】:

  • 酷而复杂的解决方案。但是为什么不实施大卫华莱士的解决方案呢?我想保持简单!
  • @SoulMagnet ExecutorService 在刚启动线程上的使用是多方面的。首先,使用 ExecutorService 可以让您管理线程的行为。您可以保留具有大小和执行行为限制的线程池,并且可以更轻松地控制线程生命周期行为。如果没有线程池来管理这种行为,您就会给开发人员带来更大的负担来管理每个线程。从架构的角度来看,我提供的示例并不是管理应用程序中线程的最佳方法,但它确实演示了如何使用 ExecutorService。
【解决方案2】:

您需要做的就是为循环的每次迭代生成一个新的Thread。我可能会这样做。

for ( /* whatever */ ) {
    new Thread() {
        public void run() {
            myMethod();
        }
    }.start();
}

【讨论】:

  • 保持简单的方法。我喜欢!
猜你喜欢
  • 1970-01-01
  • 2015-12-22
  • 2016-04-25
  • 1970-01-01
  • 2015-05-12
  • 2021-10-15
  • 2021-12-15
  • 2020-04-08
  • 1970-01-01
相关资源
最近更新 更多