たとえば、ループするような処理を走らせているスレッドを、メインスレッドから一時的に停止させたのち、もう一度処理を続行させたいときは、以下のように外部のフラグによって停止させると良い。(というか今の僕にはこれしか思いつかなかった。Queueとか使う手もありかと)
まずはスレッドを作ります
@stop = false th = Thread.new do loop do # some task here Thread.stop if @stop end end p Thread.list #=> [#<Thread:0xb7cc6a5c run>, #<Thread:0xb7cd41ac run>]
次に停止させてみます
@stop = true sleep 1 p Thread.list #=> [#<Thread:0xb7cc6a5c sleep>, #<Thread:0xb7cd41ac run>]
最後に再び動かします
@stop = false th.run sleep 1 p Thread.list [#<Thread:0xb7cd29d8 run>, #<Thread:0xb7ce01b4 run>]
まとめ
こんな感じで外部のフラグを使うと、期待する動作をしてくれます。 ただし、実際に使う際には、停止の判定をもう少しうまく書く必要があると思いますが。
裏でどうなっているのかは知らずに希望だけで書くと、
Thread.stop(th)
とか
th.stop
のように書けるとうれしいのですが、出来ないのでしょうか。
ちなみに当然ですが全て同一プロセス内を仮定しています。