【发布时间】:2019-11-30 04:38:20
【问题描述】:
我正在尝试通过 Executors 了解如何使用线程池。
我正在尝试打印从 1 到 10 的 10 数字的阶乘结果(不一定以相同的顺序),以先完成者为准,然后让线程休眠 1-5 秒,这将随机选择。
这是我的可调用任务:
class FactorialCalculator implements Callable{
@Override
public Integer call() throws Exception {
int i= 1, temp = num;
while (temp > 1){
i = i*temp;
temp--;
}
int x = ThreadLocalRandom.current().nextInt(1, 6);
Thread.sleep(x * 1000);
return i ;
}
}
这是我的主要课程:
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService e = Executors.newFixedThreadPool(10);
Set <Future<Integer>> set= new HashSet<Future<Integer>>();
int totalSum = 0;
for (int i = 1; i <= 10; i++) {
set.add(e.submit(new FactorialCalculator(i)));
}
while(!set.isEmpty()) {
Iterator<Future<Integer>> iter = set.iterator();
Future<Integer> fi = iter.next();
if(fi.isDone()) {
int temp = fi.get();
System.out.println(temp);
iter.remove();
}
}
}
我在 Eclipse 上运行了这个程序 10 次,每次输出都一样。
然后我通过命令提示符编译它,然后在那里运行它。输出与 eclipse 不同,但再次运行多次将在此处产生相同的输出。
为什么输出不是随机出现的?
提前致谢。
更新:
感谢 Ben 指出问题:
这是我所做的更改:
Iterator<Future<Integer>> iter = list.iterator();
while(!list.isEmpty()) {
Future<Integer> fi = iter.next();
if(fi.isDone()) {
int temp = fi.get();
System.out.println(temp);
iter.remove();
}
if(!list.isEmpty() && iter.hasNext() == false) {
iter = list.iterator();
}
}
【问题讨论】:
标签: java random threadpool future executorservice