ちなみに

火曜日の空は僕を押しつぶした。

あるスレッドを別のスレッドから制御する

たとえば、ループするような処理を走らせているスレッドを、メインスレッドから一時的に停止させたのち、もう一度処理を続行させたいときは、以下のように外部のフラグによって停止させると良い。(というか今の僕にはこれしか思いつかなかった。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

のように書けるとうれしいのですが、出来ないのでしょうか。

ちなみに当然ですが全て同一プロセス内を仮定しています。