Java Foreach循环转到下一个迭代,而不等待当前迭代

Java Foreach循环转到下一个迭代,而不等待当前迭代,java,asynchronous,methods,foreach,Java,Asynchronous,Methods,Foreach,在foreach循环中,我调用一个方法: for (Iterable pl : ilist) { myMethod(); } myMethod()对于currennt(如分钟或天)p1对象可能需要很长时间,但wile ExecutionGi希望继续进行下一次迭代。(据我所知,这可以称为异步调用) 使用foreach循环也可以这样做吗?如果要计划异步完成这些任务,可以创建一个新的Runnable并将其交给ExecutorService在另一个线程上运行该操作。现在,您需要知道如何处理此任务的

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

for (Iterable pl : ilist) {

myMethod();

}
myMethod()对于currennt(如分钟或天)p1对象可能需要很长时间,但wile ExecutionGi希望继续进行下一次迭代。(据我所知,这可以称为异步调用)


使用foreach循环也可以这样做吗?

如果要计划异步完成这些任务,可以创建一个新的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.
        }
    };
}
//包含10个线程的ExecutorService线程池
ExecutorService executor=Executors.newFixedThreadPool(10);
公共无效迭代(集合){
用于(对象o:集合){
executor.execute(createTask(o));
}
}
公共可运行createTask(最终对象o){
返回新的Runnable(){
公开募捐{
//完成任务。
}
};
}

您将需要查看Callable和Future以获得更复杂的功能。

如果您希望计划异步完成这些任务,可以创建一个新的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.
        }
    };
}
//包含10个线程的ExecutorService线程池
ExecutorService executor=Executors.newFixedThreadPool(10);
公共无效迭代(集合){
用于(对象o:集合){
executor.execute(createTask(o));
}
}
公共可运行createTask(最终对象o){
返回新的Runnable(){
公开募捐{
//完成任务。
}
};
}

您将需要查看Callable和Future以获得更复杂的功能。

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

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

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

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

不可能。您可以在这里使用线程,或者等待Java-8,它将允许并行流式传输iterables。不,这是不可能的。您可以在这里使用线程,或者等待Java-8,它将允许iterables的并行流。酷而复杂的解决方案。但为什么不实施大卫·华莱士的解决方案呢?我想保持简单@SoulMagnet在刚开始的线程上使用ExecutorService是很多倍的。首先,使用ExecutorService可以管理线程的行为。您可以保留对大小和执行行为有限制的线程池,并且可以更轻松地控制线程生命周期行为。如果没有线程池来管理这种行为,那么开发人员管理每个线程的负担就会更大。从体系结构的角度来看,我提供的示例并不是管理应用程序中线程的最佳方法,但它确实演示了如何使用ExecutorService.Cool&Professional解决方案。但为什么不实施大卫·华莱士的解决方案呢?我想保持简单@SoulMagnet在刚开始的线程上使用ExecutorService是很多倍的。首先,使用ExecutorService可以管理线程的行为。您可以保留对大小和执行行为有限制的线程池,并且可以更轻松地控制线程生命周期行为。如果没有线程池来管理这种行为,那么开发人员管理每个线程的负担就会更大。从体系结构的角度来看,我提供的示例不是管理应用程序中线程的最佳方法,但它确实演示了如何使用ExecutorService。我喜欢!保持简单的方法。我喜欢!