我正在尝试学习通过Executors使用线程池。我正在尝试打印10
从1到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();
}
}
我相信这是因为您是在while循环内部而不是外部声明迭代器。这意味着您总是从可迭代对象中获取第一个元素,并检查是否已完成。如果不是,则再次循环,再次检查集合中的第一个元素。
一旦可迭代对象的当前头完成,它仅从集合中选择下一个项目,因此您要按顺序删除项目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句