【发布时间】:2016-06-01 19:26:44
【问题描述】:
Java并发框架的新提交方法。想知道当我调用提交或调用获取时线程是否被执行?研究了Oracle官方文档,但找不到太多信息。谢谢。
我指的是下面的示例,
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();
}
}
【问题讨论】:
-
@JBNizet,为回复投票,我阅读了这份文件。没有明确说明提交时是否执行任务(考虑简单的情况,有足够数量的活动线程,而不是要运行的任务数量)。我从文档中的猜测是,我提交时执行了任务,但我不确定,所以我才来这里问。感谢您的建议。
-
如果有可用线程(即队列为空),则立即执行任务。否则,它会被放入队列中,直到有线程可用。
-
任务在提交后执行,并且有空闲的工作线程来实际执行它。调用 get() 对执行没有影响。
标签: java multithreading java.util.concurrent