各スレッドが使用する時間を制御したい。
1 つのスレッドが何らかの処理を行い、別のスレッドがデータベース内のデータを処理しますが、生成されるデータの量が原因で、挿入は処理よりも遅くなります。そのデータを挿入するためのプロセッサー時間を増やしたいのです。
スレッドでこれを行うことは可能ですか? 今のところ処理をしているスレッドにスリープを入れていますが、挿入するタイミングはマシンによって異なります。これを行う別の方法はありますか?プログラム内でスレッド同期を使用する方法はありますか?
各スレッドが使用する時間を制御したい。
1 つのスレッドが何らかの処理を行い、別のスレッドがデータベース内のデータを処理しますが、生成されるデータの量が原因で、挿入は処理よりも遅くなります。そのデータを挿入するためのプロセッサー時間を増やしたいのです。
スレッドでこれを行うことは可能ですか? 今のところ処理をしているスレッドにスリープを入れていますが、挿入するタイミングはマシンによって異なります。これを行う別の方法はありますか?プログラム内でスレッド同期を使用する方法はありますか?
Thread.setPriority(...)を使用してスレッドの優先度を上げることができますが、これは理想的ではありません。
おそらく、java.util.concurrent パッケージの何らかの形式のブロッキング キューを使用して、別のスレッドが何かを実行している間、1 つのスレッドを待機させることができます。たとえば、SynchronousQueueを使用して、ある Thread から別の Thread にメッセージを送信して、何かを実行できるようにすることができます。
もう 1 つの方法は、Threads の代わりに Runnables を使用し、Runnables をThreadPoolExecutorなどの Executor に送信することです。このエグゼキュータには、Runnables がかなりの時間を使用していることを確認する役割があります。
最初に言及することは、スレッドの優先度自体が「CPU のシェア」を意味するわけではないということです。スレッドの優先度が実際に何を意味するかについては、多くの混乱があるようです。これは、OS が異なれば、実際には異なることを意味することもあります。Linux で作業している場合、実際には CPU の相対的なシェアに近いものを意味します。しかし、Windows では、そうではありません。したがって、それが役立つ場合は、最初に Java のスレッド優先度について少し前にまとめた情報を確認することをお勧めします。これは、さまざまなシステムでのスレッド優先度の実際の意味を説明しています。
あなたの質問に対する一般的な答えは、スレッドに CPU の特定のシェアを持たせたい場合は、プログラムで暗黙的に行う方がよいということです。厳密に言えば同じではありません)、適切な時間だけスリープして、処理時間とスリープ時間の比率が意図した処理時間のほぼ % になるようにします。
ただし、ここでの作業に実際に役立つかどうかはわかりません。
私が理解しているように、基本的にはレート決定ステップである挿入タスクがあります。平均的な状況では、システムがその挿入を実行するスレッドに「意図的に、または必要以上に少ない CPU を割り当てている」ことはほとんどありません。
そのため、その挿入タスクを見て、その挿入タスクがどのように機能するかをプログラムで変更できるかどうかを確認することには、おそらくより多くのマイレージがあります。例: より大きなバッチで挿入できますか? 挿入プロセスが実際に何らかの理由で CPU バウンドである場合 (これは疑わしい)、マルチスレッド化できますか? アプリケーションが実際に挿入が完了するのを待つ必要があるのはなぜですか? また、その依存関係を変更できますか?
挿入が標準の DB システムに対するものである場合、その挿入がひどく CPU バウンドなのだろうか?
1 つの方法は、処理スレッドの優先度を他のスレッドよりも低く設定することです。ただし、コード プラットフォームの独立性を維持できないため、これはお勧めできません。(異なるスレッドの優先度は、異なるプラットフォームでは異なる動作をします)。
もう 1 つの方法は、データベース スレッドが現在のステータスに関するメッセージを送信し続けるサービスを使用することです (おそらく、何らかのフラグ「aboutToOver」)。
または、バイナリセマフォなどの同期を使用します。データベース スレッドが動作している場合、他のスレッドがブロックされるため、データベース スレッドがすべてのリソースを使用することになります。しかし、再び処理中のスレッドはブロックされます。processign スレッドは 3 ~ 4 個のタスクを実行でき、後で再び起動してタスクを実行できるようになるまでセマフォによってブロックされるため、実際にはこれが最適なソリューションです。