2013-03-11 50 views
0

我注意到,自從Scala 2.9。*以來,setMaximumPoolSize方法似乎從ForkJoinPool消失了,它看起來像是我想要的。大多數關於限制Scala平行集合中並行性的討論圍繞着同一個類的setParallelism方法(它也消失了,但對我來說不是那麼嚴重),但在我的情況下,並行任務可以執行外部IO,並且經常會阻止它。 ForkJoinPool然後在這種情況下啓動更多的線程,並有效地執行鍼對有問題的共享IO資源的DOS,這是不可取的。Replacement for setMaximumPoolSize on ForkJoinPool

有沒有辦法以某種方式限制池中的線程數?我並不在乎IO產生的行爲,但我想要一定程度的並行性,因爲我的IO任務是獨立的,不會互相干擾。

回答

1

您引用的行爲稱爲「延續線程」。由於join()方法不會執行上下文切換,因此框架將在沒有這些附加線程的情況下停止。已經有數百/數千個這些額外線程產生的報道。

Java8用「延續線程」代替了這種可怕的做法。也就是說,線程繼續從雙端隊列中獲取任務,但可能導致失速或堆棧溢出。沒有替代使用ForkJoinPool.managedBlock()的代碼,這可能是您處於I/O的位置。

+0

Java8之前有什麼可做的嗎?據我瞭解,Scala的'ForkJoinPool'是java代碼的副本,可以避免依賴於更新的JRE而不願意依賴它,但是我不認爲當前的Scala版本有你提到的那些延續線程。我的目標是避免獲得數千個併發IO線程,並且我並不介意我如何到達那裏。 – 2013-03-12 13:50:24

+0

不是我所知道的。目前的Scala版本基於舊版本的jsr166代碼。該版本使用「延續線程」,這就是爲什麼你得到所有這些額外的線程。問題總是歸結爲「當線程需要發出wait()時如何釋放線程」唯一正確的答案是框架無法執行的上下文切換。 – edharned 2013-03-12 14:19:05

+0

噓! :(噢,謝謝澄清情況! – 2013-03-12 14:41:46