0

Scala 2.9。*以降、setMaximumPoolSizeメソッドが消えたForkJoinPoolように見え、私が望むことを実行しているように見えることに気づきました。Scalaの並列コレクションで並列処理を制限することに関するほとんどの議論は、同じクラスのメソッドを中心にしてsetParallelismいます(これも消えましたが、私にとってはそれほど問題ではありません)が、私の場合、並列タスクは外部IOを実行でき、多くの場合ブロックされますその上に。次にForkJoinPool、その場合により多くのスレッドを起動し、問題の共有IOリソースに対してDOSを効果的に実行しますが、これは望ましくありません。

何らかの方法でプール内のスレッドの数を制限する方法はありますか?IOでブロックされたときにスポーンする動作についてはあまり気にしませんが、IOタスクは独立しており、相互に干渉しないため、ある程度の並列処理が必要です。

4

1 に答える 1

1

あなたが参照する動作は「継続スレッド」と呼ばれます。join() メソッドはコンテキストの切り替えを行わないため、フレームワークはこれらの追加スレッドなしで停止します。これらの余分なスレッドが数百/数千生成されたという報告があります。

Java8 は、このひどい慣行を「継続スレッド」に置き換えます。つまり、スレッドは両端キューからタスクをフェッチし続けますが、ストールまたはスタック オーバーフローが発生する可能性があります。ForkJoinPool.managedBlock() を使用するコードに代わるものはありません。これは、I/O を使用している可能性があります。

于 2013-03-12T13:42:53.757 に答える