私は、さまざまなソースによってトリガーされるプロセスを持っています。シングルスレッド実行を適切に管理する方法は?
特定の条件下で他のプロセス(「manualStarter」と呼ぶ)がこのメインプロセスをトリガーしたい場合があるとします。メインプロセスには10秒〜10分かかるとします。 manualStarterが起動しようとしている間にプロセスがすでに進行中の場合は、複数回キューに入れてはいけません。メインプロセスの開始をトリガする2つ目のプロセスは、プロセスを一時的にトリガする「timedStarter」でもかまいませんが、プロセスが実行されていない場合にのみ実行されます。それはしばらくしてからもう一度。
これでisAlive()とjoin()を使用してこの種のプロセスマネージャを実装しようとしましたが、isAlive()は状態が生き残るまで、スレッドが開始されることがあります。だから私はそれに頼ることができなかったようだ。
次に、私が探しているものに近いところにあるSingleThreadExecutorサービスを試してみました。何もブロックしていないし、単一のスレッドしかプロセスを実行できないので、ステータスをチェックしたり、それを正しくロックしたり、スレッドを開始するキューが1より大きくならないようにするにはどうすればいいですか?私はセマフォがよく似たような種類のタスクに使用されていることを少しは読んだが、私はこのシナリオでどのように使用できるのでしょうか。
どのようにして私が望むものを達成することができますか?私自身のThreadPoolExecutorを実装する必要がありますか?どうしたらいいですか?もっと良い方法はありますか?
:
は、その後どこかには、定期的に何かをやって実行するための主なものをスケジュールします。 –
@ワシアマドええ、私はそれが私が理解するために問題を抱えていることを信じています - どこでどのように使用するのですか? –
ちょっと疑問:スレッドを起動しない方が簡単ではないかもしれませんが、いくつかのコマンドオブジェクトを**キュー**に追加するのは簡単でしょうか?言い換えれば、あなたの外部ソースからコマンドを同じキューに出力させるだけです。コンポーネントは定期的にそのキューの内容をスキャンし、そのスレッドを呼び出します(必要な場合)。ちょうど新しいコマンドを押して、キューは "ああ、私たちは現在実行されているので、1つは破棄することができます"という仕事をしていますか? – GhostCat