假设我有这个代码:
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"完成,反过来(因为使用相同的公共池)但为什么总是强迫吗?
这是那些在以后的版本中可能发生变化的事情之一吗?
我有以下代码:
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)的节点,但不是在自身".
我正在尝试对一些大数据实施分而治之的解决方案。我使用 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 框架是否维护可用线程的池大小?或者我应该将这个条件添加到我的分治逻辑中?