1

最近は、並行オブジェクトのマルチコアへの展開に取り組んでいます。サンプルでは、​​仕様にブロッキングBlockingQueue.take()と記載されているメソッドを使用しています。これは、メソッドが、他の並行タスクに再利用できるように、囲んでいるスレッドのリソースを解放しないことを意味します。これは、JVM インスタンス内のライブ スレッドの総数が制限されているため便利です。また、アプリケーションが何千ものライブ スレッドを必要とする場合、中断されたスレッドを再利用できることが不可欠です。一方、JVM は、アプリケーション レベルのスレッドから Java の OS レベルのスレッドへの 1:1 マッピングを使用します。つまり、各 Java Thread インスタンスは、基盤となる OS レベルのスレッドになります。

java.util.concurrency現在のソリューションは、Java 1.5+ に基づいています。それでも、多数に拡張できるワーカー スレッドが必要です。今、私は次の答えを見つけることに興味があります:

  • java.lang.Thread独自の Thread 実装をプラグインできるように、JVMの実装を置き換える方法はありますか?
  • これは、JVM のスレッド実装の C++ セクションを微調整して再コンパイルすることによってのみ可能ですか?
  • Java の古典的なスレッドを置き換える方法を提供するライブラリはありますか?
  • 繰り返しますが、同じ行に、Javaの一部のスレッドをOS レベルの1 つのスレッドのみにマップする方法をガイドするライブラリまたは方法はありますか?

また、これがJVMのさまざまな実装について議論しているのを見つけましたが、それらが役立つかどうかはわかりません.

事前にコメントやアイデアをお寄せいただきありがとうございます。

4

1 に答える 1

1

何千ものスレッドを作成している場合、それは間違っています。

代わりに、Executorフレームワークの使用を検討してください。(ExecutorsおよびThreadPoolExecutorクラスから始めます。)これらを使用すると、数千のタスクをキューに入れながら、それらを処理するスレッドの数を増やすことができます。

このアプローチは、「従来のスレッドを置き換えるライブラリ」が意味するものだと思います。エグゼキュータを調べることを強くお勧めします。

注意点:エグゼキュータは、デフォルトでデーモン以外のスレッドを使用します。したがって、エグゼキュータを使い終わったら、エグゼキュータをシャットダウンする必要があります。すべてのスレッドが終了するのを待つだけではなく、プログラムを終了する通常の方法がある場合は、プログラムの終了時にこれを行うことができます。:-)

于 2011-07-20T21:20:18.593 に答える