6

私は問題を解決するためのJavaのかなり標準的なメカニズムを持っています:

  • 作業項目は、特定の時間に実行するようにスケジュールする必要があります
  • 次に、各作業項目は、条件が真になるのを待つ必要があります
  • 作業項目はキャンセル可能である必要があります

私が使用する解決策は次のとおりです。

  1. 作業項目をスケジュールするためのシングルスレッドスケジューラを用意する
  2. ExecutorService(マルチスレッドの場合があります)
  3. 次に、スケジュールされた各作業項目は、実際の作業をに送信しExecutorServiceます。返さFutureれたものはマップにキャッシュされます。完了サービスは、作業が完了したときにキャッシュから未来を削除するために使用されます
  4. アイテムは、キャッシュされた先物を介してキャンセルできます

もちろん、私のエグゼキュータは、少なくとも私が期待するブロッキング作業項目の数と同じくらいの数である必要がありますが、これは実際には問題ではありません。

だから今、私はScalaでコーディングし、アクターフレームワークを使用しています。私の作業項目をアクターに送信されるイベントにカプセル化できると仮定すると、次のようになります。

  1. 特定の時間に作業項目をスケジュールするためにどのメカニズムを使用しますか?
  2. 作業項目がアクターに送信されるイベントである場合、バッキングスレッドプールが同時にブロックできる項目の数よりも大きいことを確認するにはどうすればよいですか?
  3. 以前にスケジュールされた作業項目をキャンセルするにはどうすればよいですか?
4

2 に答える 2

5

特定の時間に作業項目をスケジュールするためにどのメカニズムを使用しますか?

java.util.concurrent.ScheduledExecutorServiceを使用します。

作業項目がアクターに送信されるイベントである場合、バッキングスレッドプールが同時にブロックできる項目の数よりも大きいことを確認するにはどうすればよいですか?

これは、並列化の努力を打ち負かす設計として私を驚かせます。ブロッキングとグローバル状態を最小化または排除してみてください。これらは、構成可能性とスケーラビリティに対する障壁です。たとえば、ファイルが到着するのを待ってからアクターにイベントを発生させる単一の専用スレッドを用意することを検討してください。または、非同期の非ブロッキングI/Oについてはjava.nioを参照してください。

ここでの要件を完全には理解していませんが、I/Oイベントを検索する単一のスレッド/アクターを持つことができるようです。次に、スケジュールされた「作業項目」として、非ブロッキングアクターを作成するエフェクトをスケジュールします。それらのアクターにI/Oスレッド/アクターに登録してもらい、関心のあるI/Oイベントに関するメッセージを受信させます。

以前にスケジュールされた作業項目をキャンセルするにはどうすればよいですか?

ScheduledExecutorService先物を返します。あなたが持っているものは、その点で悪いデザインではありません。それらをマップに収集し、future.cancel()を呼び出します。

于 2009-06-06T03:54:40.903 に答える
1

スケジュールされたアクターのリストを持ち、Actor.receiveWithin()を使用して1秒ごとにウェイクアップし、実行の準備ができているアクターにメッセージを送信するスケジューリングアクターを作成できます。スケジューリングアクターはキャンセルも処理できます。もう1つのオプションは、スケジューリングを一元化するのではなく、すべてのアクターがreceiveWithin()を使用して独自のスケジューリングを直接処理できるようにすることです。

この問題については、Scalaのスケジューラーのような単純なcronのブログ投稿にいくつかの議論があります。

于 2009-06-07T07:13:39.597 に答える