Techioz Blog

Thread#run と Thread#wakeup の違いは?

概要

Ruby では、Thread#run と Thread#wakup の違いは何ですか?

RDoc では、スケジューラが Thread#wakeup で呼び出されないように指定されていますが、これは何を意味しますか? wakeup と run をいつ使用するかの例は?ありがとう。

編集: Thread#wakup によってスレッドが実行可能になることはわかりましたが、Thread#run が実行されるまで (スレッドがウェイクアップされる) まで実行されない場合は、何の役に立つでしょうか?

誰かがウェイクアップが何か意味のあることを行う例を提供してもらえますか?好奇心のために =)

解決策

これが何を意味するかを説明する例を次に示します (コード例はここから)。

スレッド.ウェイクアップ

thread = Thread.new do 
  Thread.stop
  puts "Inside the thread block"
end

$ thread
=> #<Thread:0x100394008 sleep> 

上記の出力は、新しく作成されたスレッドが stop コマンドによりスリープ状態になっていることを示しています。

$ thread.wakeup
=> #<Thread:0x100394008 run>

この出力は、スレッドがスリープ状態ではなくなり、実行できることを示します。

$ thread.run
Inside the thread block
=> #<Thread:0x1005d9930 sleep>   

ここで、スレッドは実行を続行し、文字列を出力します。

$ thread.run
ThreadError: killed thread

スレッド実行

thread = Thread.new do 
  Thread.stop
  puts "Inside the thread block"
end

$ thread
=> #<Thread:0x100394008 sleep> 

$ thread.run
Inside the thread block
=> #<Thread:0x1005d9930 sleep>   

スレッドは起動するだけでなく、実行を継続して文字列を出力します。

$ thread.run
ThreadError: killed thread