2017-08-19 6 views
0

私はバックグラウンドスレッドを持つWebアプリケーションを持っています。 Executors.newSingleThreadExecutorであるこのスレッドには、低優先度と見なされるタスクが与えられます。タスクが完了すると気にしません。多くの場合、送信されたタスクはリモートDBへのログの一種です。Javaのバックグラウンドスレッド:低学年

私は、Thread.setPriorityを使ってスレッドの実際の優先順位を変更してはいけないと何度も読んでいます。その場合、私は私のバックグラウンドタスクが私のサーバーのより重要なタスクを妨害しないようにします。どのような戦略を使うことができますか?私はのThread.sleepを入れて検討しています

(1)またはバックグラウンドタスクのrun()メソッドの先頭にyeild():ここで

は、私が考えていものです。これは、他のスレッドが、その時点で何かする必要がある場合に先に飛び越えることを可能にします。しかし、これはハッキリしているようです。提案?

+1

あなたは何度も何度も読んでいますか?あなたが何をしたいのか分かっているなら、それをしてください。考えているほどの効果はないかもしれませんが、それはおそらくあなたの言葉のない情報源があなたに語っているものですが、それがあなたが必要と考えるものなら、あなたはそれが必要です。 – EJP

答えて

0

エグゼキュータはシングルスレッドであるため、1つのコアのみを占有することができます。サーバがN個のコアを持っている限り、それらのバックグラウンド・タスクは、新しいスレッドを生成したり、他のスレッド・プールに単独でディスパッチしたりしないと仮定して、サーバ負荷の1/N以上を占めることはありません。

また、あなたがpriority queueで構成された一つのスレッド・プールを介してすべてのタスク(低および高優先度)スケジュールし、それが低い優先度を持っているように、それぞれのバックグラウンドタスクを飾ることができます。私。スケジューリングをカーネルからユーザー空間に移動できます。

+0

私は単一のコアVPSを持っています。 – adamM

0

バックグラウンドタスクのrun()メソッドの先頭にThread.sleep(1)またはyeild()を配置することを検討しています。これは、他のスレッドが、その時点で何かする必要がある場合に先に飛び越えることを可能にします。しかし、これはハッキリしているようです。提案?

thread.yield()多くのスレッドの実装では、多くの場合、何もしませんし、あなたのバックグラウンドスレッドが本当にまだ動作して開始されていないので、run()方法の開始時にそれたり睡眠を置くことはほとんど、あるいは何を行います。

私のバックグラウンドタスクが私のサーバーのより重要なタスクを妨げないようにしたい。どのような戦略を使うことができますか?

スレッドの優先度を使用すると、スレッドに与えられるサイクル数にほとんど影響を与えないことがよくあります。しかし、これはあなたのアーキテクチャーの多くに依存します。だから私は確かにそれらが役立つかどうかを見てみるでしょう。他のより重要なスレッドからサイクルを離れさせる高性能操作が心配な場合は、Thread.sleep(...)コールを使用してアルゴリズム内のループやその他の重要な場所にペーストするだけです。確かにハッキングするかもしれませんが、効果があります。

厄介な部分は、どこにコールを入れるか、何ミリ秒の睡眠を使うべきかなどです。それは、睡眠の配置を最適化するためのテストと繰り返しが必要です。また、サードパーティの図書館などに電話をしている場合は、とにかく中核となる場所に睡眠呼を入れることができないかもしれません。

正常な痛みポイントにアクセスできない場合は、処理のためにバックグラウンド処理をリモートシステムにオフロードすること以外は選択肢がない場合があります。

関連する問題