ThreadPoolExecutorはJavaですぐに実行するために取得する方法

ABC:

私が持っているThreadPoolExecutorRunnable呼ばれますthis.runnable私はこのようにそれを実行します。

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
executor.execute(this.runnable);

通常、this.runnable(100-200us後)ほとんどすぐに呼び出されます。しかし、時にはCPUがビジー状態の場合には、実行に時間がかかる場合があります。

このスレッドの実行をprioritseするため、私は「力」これはJVM / ThreadPoolExecutorにすぐに実行、または提案することができます方法はありますか?私は別のスレッドとしてそれを維持する必要があるが、同時に、私はそれが緊急に実行を開始する必要があります。

ネイサン・ヒューズ:

あなたは、タスクをキューにPriorityBlockingQueueを使用することができます。それは、すぐに作業員が解放されるように実行してその方法は、優先度の高いタスクがキュー内で最高のスポットを与えることができます。それは合併症とオーバーヘッドを追加し、優先度の低いタスクが飢えれるかもしれませんので、しかし、私は、このオプションは好きではありません。

スレッドの優先順位の周りDinkingすることは、通常うまく動作しません。優先順位に依存するコードは、異なるプラットフォーム上の異なる動作を有することができるので、異なるプラットフォームは異なる優先度レベルを実装します。また、異なる優先度のスレッドを持つことが発生することが容易になり、優先度逆転のバグをここでは本何練習でのJava並行処理(10.3.1)の優先順位について言いたいことがあります。

これは、スレッドの優先順位を調整する誘惑に抵抗するのが賢明が一般的です。すぐに優先順位を変更し始めると、アプリケーションの動作は、プラットフォーム固有になり、あなたは飢餓の危険性を紹介します。あなたは、多くの場合、スレッドの優先度の低下させるために多くの時間を与えるための試みで、奇数の場所でのThread.sleepやThread.yieldのコールの存在によって優先度の微調整や他の応答性の問題から回復しようとしているプログラムを見つけることができます。

他の人が前に言ったように、あなたは(あなたはそれがCPUのために他のプロセスと競合していないプラットフォームにアプリケーションを移動する必要があります)CPUを使用してから、他のプロセスを妨げることはできず、OSに強制することはできません特定のスレッドをスケジュールして実行します。

あなただけの1つのスレッドプールに自分自身を制限する必要はありませんが、複数のプールを持っているために、時には良い理由がありますJCIP(8.1)がアドバイス:

タスクが均質かつ独立しているとき、スレッド・プールが最適です。長時間実行ミキシングおよび短期実行中のタスクは、それが非常に大きい場合を除き、プールを「目詰まり」リスク。プールが無制限である場合を除き、他のタスクに依存してタスクを送信することは、デッドロックをリスク。

あなたはニーズがすぐにやっていることを短いタスクを持っている、そしてそれは、複数の大きなタスクの後ろにキューに入れられたばかり立ち往生する傾向がある場合は、優先度の高いタスクのための別の専用スレッドプールを必要としています。

私は何をするだろう。

  • まず、必ずスレッドプールは起動時に、一度だけ初期化され、複数のスレッドを持っているスレッドプールのサイズを調整していることを確認します。一つのスレッドだけであなたのタスクは、ちょうど別の1の後ろにブロックされることがあります。

  • CPUが問題であるならば、あなたのアプリケーションがデプロイされた場合、それは他のプロセスと共有CPUに持っている、またはその他のホスティングを修正しないように、その周りに行くために多くのCPUがあります変更することを検討してください。

  • プールがボトルネックであり続けた場合、優先度の高いタスクのための高速車線として使用するために別のスレッドプールを作ります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=313603&siteId=1