在使用random和threadpool时,为什么输出顺序没有改变?

尼基:

我正在尝试学习通过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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在使用`log.Println`和`fmt.Println`时改变输出顺序?

在AngualrJS中使用controllerAs时为什么没有输出

为什么程序没有在信号值改变时终止?

为什么单击时我的颜色没有改变?

为什么在使用 style.backgroundColor 时背景颜色没有改变?

为什么在使用while循环时我的外部变量没有改变?

为什么在我使用 for of 循环修改innerText 时span 元素的innerText 没有改变?

为什么`terraform fmt`在似乎没有改变任何东西时输出文件名?

为什么这些带有“and”的语句的顺序即使带有括号也会改变输出?

为什么当我改变边界时视图没有改变?

为什么添加三通会改变输出顺序

为什么逻辑和顺序改变会给出不同的输出?

为什么从 StdoutPipe 读取会改变输出顺序?

为什么原型对象没有改变?

为什么我的观点没有改变?

为什么文本的活动没有改变?

为什么状态没有改变?

为什么传奇标题没有改变?

为什么a的ID没有改变?

为什么两次使用grep时都没有显示输出?

使用Flask渲染模板时,为什么我的html代码没有输出变量的值?

为什么在C ++中使用字符串时没有输出?

为什么没有输出?

为什么在bash中输入#时没有输出

为什么使用printf和cout的这段代码没有预期的输出?

为什么当我使用 display: inline-block; 时我的 div 的顺序会改变?

为什么在使用格式字符串时,Console.WriteLine输出的文本中没有格式字符串和类型名称?

为什么每次运行一个命令时位置变量都没有改变

当我没有给变量赋值时,为什么变量的值会改变?