それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Rubyマルチスレッドその1

Rubyでマルチスレッドを動かしてみる。

Rubyでスレッドを動かす例

#/usr/bin/env ruby
#Threadで動かしてみる
puts "スレッドテスト"
puts "スレッド作成"
t = Thread.new {
  puts "Thread 開始"
  sleep 3
  puts "Thread 終了"
}
puts "他スレッド待ち"
main_thread = Thread.main
t.join
puts "END"

Rubyでスレッドを複数作る

main以外に複数スレッドを作る

#!/usr/bin/env ruby 
#スレッドを使う。
puts "Threading test"
t1 = Thread.new {
  puts "Thread started"
  while true do
    puts "thread 1_body"
    sleep 2
  end
  puts "End Thread"
}
t2 = Thread.new {
  puts "Thread started"
  while true do
    puts "thread 2_body"
    sleep 1
  end
  puts "End Thread"
}
puts "Waiting Other Thread..."
t1.join
puts "END"
実行例
$ >ruby thread02.rb 
Threading test
Thread started
thread 1_body
Thread started
thread 2_body      #交互に現れる

Mainスレッドは?

RubyはMainスレッドが終了すると、Rubyインタプリタ(VM)が終了する。そのためMainスレッドで、他スレッドをまつことになる。(t.join)

Javaとの違い

Javaの public static void main (arg){} とメインスレッドをRubyで表現するなら代替こんな感じ

def main(*args)
 #Javaで言うところのMain
 #do something 
end

our_main=Thread.new{main()} #Javaでは見えないところ。
our_main.join 

RubyからみるとJavaのMainはdefの内側にある感じ。Javaから見ると、Rubyのメインスレッドは外側になる感じ。