相关疑难解决方法(0)

并行flatMap总是顺序的

假设我有这个代码:

 Collections.singletonList(10)
            .parallelStream() // .stream() - nothing changes
            .flatMap(x -> Stream.iterate(0, i -> i + 1)
                    .limit(x)
                    .parallel()
                    .peek(m -> {
                        System.out.println(Thread.currentThread().getName());
                    }))
            .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

输出是相同的线程名称,因此这里没有任何好处parallel- 我的意思是,有一个线程可以完成所有工作.

里面flatMap有这个代码:

result.sequential().forEach(downstream);
Run Code Online (Sandbox Code Playgroud)

我理解强制sequential属性如果"外部"流将是并行的(它们可能会阻塞),"外部"将不得不等待"flatMap"完成,反过来(因为使用相同的公共池)但为什么总是强迫吗?

这是那些在以后的版本中可能发生变化的事情之一吗?

java java-8 java-stream java-9

9
推荐指数
1
解决办法
1683
查看次数

Java 8 forEach over Multiple IntStreams

我有以下代码:

    IntStream.range(0, width).forEach(x1 -> {
        IntStream.range(0, height).forEach(y1 -> {
            IntStream.rangeClosed(x1-1, x1+1).forEach(x2 -> {
                IntStream.rangeClosed(y1-1, y1+1).forEach(y2 -> {
                    if ((x1 != x2 || y1 != y2) && getNode(x2, y2) != null){
                        getNode(x1, y1).registerObserverAtNeighbor(getNode(x2, y2));
                    }
                });
            });
        });
    });
Run Code Online (Sandbox Code Playgroud)

有没有办法使用较少的嵌套语句编写上述内容?它基本上是"从(0,0)到(宽度,高度)寄存器观察者的每个节点从(x-1,y-1)到(x + 1,y + 1)的节点,但不是在自身".

java lambda java-8 java-stream

5
推荐指数
1
解决办法
1951
查看次数

我如何知道 Java 中的 Fork 和 Join 是否有足够的池大小?

我正在尝试对一些大数据实施分而治之的解决方案。我使用 fork 和 join 将事物分解为线程。但是我有一个关于分叉机制的问题:如果我将分而治之的条件设置为:

@Override
protected SomeClass compute(){
    if (list.size()<LIMIT){
        //Do something here
        ...
    }else{
        //Divide the list and invoke sub-threads
        SomeRecursiveTaskClass subWorker1 = new SomeRecursiveTaskClass(list.subList());
        SomeRecursiveTaskClass subWorker2 = new SomeRecursiveTaskClass(list.subList());
        invokeAll(subWorker1, subWorker2);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果没有足够的资源可供调用subWorker(例如池中没有足够的线程),会发生什么情况?Fork/Join 框架是否维护可用线程的池大小?或者我应该将这个条件添加到我的分治逻辑中?

java multithreading fork-join forkjoinpool

4
推荐指数
1
解决办法
3014
查看次数