【问题标题】:Sleep inside closure - Java 8 lambdas在闭包内睡觉 - Java 8 lambdas
【发布时间】:2014-05-13 13:56:30
【问题描述】:

我知道这个问题听起来很傻 - 我认为 lambdas 是并行执行的,所以当我运行类似的东西时

List<Integer> list = ArrayList<Integer>();
list.add(3);
list.add(2);
list.add(1);
list.forEach(n -> System.out.println(""+n));

我不会每次都得到“3\n2\n1\n”。我试图在闭包内进行某种 sleep() ,但看起来上面的线程睡眠,而不是每个 lambda 执行。 (类似 n -> { sleep(n*1000); System.out.println(""+n)}) 无论如何可以这样做吗?还是我错了,因为应该使用一些并行流等,而不是通常不是并发列表?还是我的想法完全错误?

【问题讨论】:

  • Thread.sleep 不能让任何其他线程,但当前线程睡眠。当前线程是执行 lambda 的线程。
  • 如果您想测试并行性,您需要的列表元素多于三个。创建几千个,然后看看会发生什么。
  • 你到底想做什么,什么没有按预期发生?

标签: java lambda closures java-8


【解决方案1】:

forEach 应用于 Iterable 通常是按顺序执行的。如果你想要并行执行,你需要创建一个并行流:list.parallelStream().forEach(...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2013-08-10
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多