新的提交Java并发框架的方法。想知道当我调用submit还是调用get时线程是否被执行?研究了甲骨文的官方文件,但找不到太多的信息。谢谢。
我指的是下面的样本,
http://www.vogella.com/tutorials/JavaConcurrency/article.html
package de.vogella.concurrency.callables;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableFutures {
private static final int NTHREDS = 10;
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);
List<Future<Long>> list = new ArrayList<Future<Long>>();
for (int i = 0; i < 20000; i++) {
Callable<Long> worker = new MyCallable();
Future<Long> submit = executor.submit(worker);
list.add(submit);
}
long sum = 0;
System.out.println(list.size());
// now retrieve the result
for (Future<Long> future : list) {
try {
sum += future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
System.out.println(sum);
executor.shutdown();
}
} 发布于 2016-06-01 19:38:16
不,调用submit并不能执行任务。调用get并不能执行任务。任务在属于执行器线程池的线程中异步处理。
调用submit方法将任务分配给线程池。任务将排队,直到池中的一个线程空闲为止。然后,池将任务分配给工作线程,后者调用代码。
当您调用Future.get时,或者某个工作人员已经完成了您的任务,另一个工作人员正在处理您的任务,或者该任务仍然在排队等待员工可用。如果您的任务完成了,那么未来将返回可调用任务返回的值,否则调用未来的get方法将导致主线程阻塞,直到任务完成。
发布于 2016-06-01 19:38:23
方法submit()将您的任务提交给线程池,而Future#get()则让当前线程等待任务由池中的一个线程执行,不管它是否失败。
https://stackoverflow.com/questions/37577213
复制相似问题