感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Rubyでマルチスレッド。スレッドの終了や停止の方法のサンプル

スポンサーリンク

Rubyで指定したスレッドを強制的に終了させる

Thread::killは引数にスレッドを取り、指定されたスレッドを強制的に終了させる。

t = Thread.start {
  loop {
    puts "hello world!"
    sleep(1)
  }
}

sleep (3)
puts "tスレッドを終了します"
Thread.kill(t)
puts t.alive?

上記のサンプルの実行結果は、以下の通り。

hello world!
hello world!
hello world!
tスレッドをkillします
false

Rubyでスレッドが生きているかどうかを調べるには、

thread_name.alive?

とすればいい。生きている時はtrue、そうでないときはfalseが返る。

Threadをkillしたくないときは、

Thread.stop

というメソッドも使える。
killでスレッドを終了させた場合は二度とそのスレッドの実行を再会することは出来ないが、
Thread.stop場合は、

some_thread.wakeup

でスレッドを再開させることができる。

Rubyでキーボードからの入力した値を取得して、表示する。

以下のサンプルは、ユーザがキーボードで入力した値をQueueにメッセージを詰め込み、標準出力に出力する。
「end」と入力したらThreadを終了する。endと打たれるまでスレッドは動き続ける。
なお、標準入力を受け取るのはgets.chompメソッド。

require 'thread'

line_queue = Queue.new

print_thread = Thread.start {
  while line = line_queue.deq
    print("this is echo:",line)
  end
}

def kill_thread (t_name)
  Thread.kill(t_name)
end

#endと入力するまでスレッドは動く
begin
  #標準入力から入力待ち
  puts ""
  puts "please input some word(end means stop)"
  line = gets.chomp
  if "end" == line
    puts "I will kill print_thread Thread"
    kill_thread(print_thread)
    break
  else
  	puts "your input:" + line
  	line_queue.enq(line)
  end
end while line

print_thread.join

実行結果は以下の通り。

please input some word(end means stop)
test
your input:test
this is echo:test
please input some word(end means stop)
hoge
your input:hoge
this is echo:hoge
please input some word(end means stop)
end
I will kill print_thread Thread

上記のサンプルをEcipseで実行すると以下のようなエラーが発生したが、コンソールでruby hoge.rbと実行すると何も起こらなかった。

C:/eclipse/pleiades/workspace/rubytest/thread.rb:2: uninitialized constant Queue (NameError)
	from C:/eclipse/pleiades/workspace/rubytest/thread.rb:1:in `require'
	from C:/eclipse/pleiades/workspace/rubytest/thread.rb:1

おそらくEclipseのモジュールの設定がおかしかったのだろう。
ちゃんと調べていない。

なお、メソッド呼び出しがメソッドの定義よりも前に実行されると「undefined local variable or method」と言うエラーが表示される。

読んだ本

Rubyアプリケーションプログラミング

Rubyアプリケーションプログラミング


隠れた良書?古いけれど、今でも全然使える!
Rubyの原則を説明してくれる本。

感謝のプログラミング

今回で感謝のプログラミングは【566時間目】
10000時間まで、あと【9434時間】