BLOGTIMES
2010/10/18

Rubyのスレッドをたたき起こす

  ruby 
このエントリーをはてなブックマークに追加

Rubyでsleepを呼んで眠っているスレッドむりやり実行状態に戻す方法(JavaだとThread.interrupt()にあたるもの)がないかと思って調べていたら、灯台下暗しでリファレンスマニュアルにThread#runで実行を再開できるとちゃんと書いてありました。sleepは組み込み関数ですが、runはThreadクラスにあるのでちょっと分かりづらいですね。

組み込み関数 - Rubyリファレンスマニュアル

sleep([sec])
sec 秒だけプログラムの実行を停止します。sec には浮動小数点数も指定できます。sec が省略された場合、他スレッドからの Thread#run などで明示的に起こさない限り永久にスリープします。戻り値は実際に停止していた秒数(整数)です。

確かに下記のようなコードを書いてみたらsleepがキャンセルされてスレッドが再開されることが確認できました。
これでsleepで眠っているThreadをjoinしようとしてプログラムが固まってしまうという状況を回避できそうです。

sleeptest.rb

require 'thread' t = Thread.new do sleep 1000 puts "hoge" end puts "join...." t.run t.join puts "done!"

実行結果

$ ruby sleeptest.rb join.... hoge done!

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3855
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン