プログラミングにおいて別々の処理を同時並行で実施するスレッド(Thread)処理はよく使われます。
スレッドを使うことで、いくつもの処理を平行して実施できるため、非常に便利です。
ここでは、「Rubyでスレッド(Thread)を使う方法が知りたい」といった方に向けて、スレッドの基本処理について解説していきます。
【基礎】そもそもThreadとは
【基礎】Threadの使い方
【基礎】Threadを終了する方法
【発展】Threadの停止と再会
Rubyのスレッドについてわかりやすく解説していますのでぜひ参考にしてください!
そもそもThreadとは
プログラムは通常処理を記述した順に実行されます。しかし、Aという処理とBという処理を同時に実行したい場合、複数のプログラムを動かさなければいけません。
しかし、スレッド(Thread)という処理を使えば、複数の処理を並行して実施することが可能です。
RubyでThreadを使用するためにはThreadクラスを使用します。
Threadの作成
オブジェクト = Thread.new do スレッドで実行する処理 end
次項ではそんなRubyのスレッド処理について詳しく見ていきましょう。
Threadの使い方
以下のサンプルではスレッドを1つ作成し、スレッド処理が終了すると同時にプログラムも終了します。
p "スレッドの開始" # スレッドの作成 t = Thread.new do # 処理を3回繰り返す for num in 1..3 do p "thread1" # 1秒スリープ sleep 1 end end p "スレッドの実行中・・・" t.join p "スレッドの終了"
実行結果:
"スレッドの開始" "スレッドの実行中・・・" "thread1" "thread1" "thread1" "スレッドの終了"
この処理ではまずThread.newでスレッドのオブジェクトを作成しています。
作成したスレッドのオブジェクトに対してjoinを指定することで、以降の処理はスレッドが終了するまで実行されません。
続いてスレッドが複数あるマルチスレッドを作成してみましょう。
puts "スレッドの開始" # スレッド1の作成 t1 = Thread.new do # 処理を3回繰り返す for num in 1..3 do puts "thread1" # 1秒スリープ sleep 1 end end # スレッド2の作成 t2 = Thread.new do # 処理を3回繰り返す for num in 1..3 do puts "thread2" # 1秒スリープ sleep 1 end end p "スレッドの実行中・・・" t1.join t2.join p "スレッドの終了"
実行結果:
スレッドの開始 "スレッドの実行中・・・" thread1 thread2 thread2 thread1 thread2 thread1 "スレッドの終了"
このようにスレッドt1とt2が同時並行的に行われていることがわかりますね!
Threadの終了
スレッドの処理を終了するにはメインスレッドよりThread.killメソッドを使用します。
puts "スレッドの開始" # スレッド1の作成 t = Thread.new do # 処理を3回繰り返す for num in 1..3 do puts "thread1" # 1秒スリープ sleep 1 end end Thread.kill(t) puts "スレッドの終了"
実行結果:
スレッドの開始 スレッドの終了
Threadの停止と再開
スレッドを途中で停止したい場合はThread.stopメソッドを使用することで停止できます。
停止したスレッドはThread.runメソッドを使用することで処理が再開されます。
以下のサンプルでは条件によってスレッド1が停止し、スレッド2が終了した時点でスレッド1が再開します。
puts "スレッドの開始" # スレッド1の作成 t1 = Thread.new do # 処理を5回繰り返す for num in 1..5 do puts "thread1" # 1秒スリープ sleep 1 if num == 1 then puts "thread1停止中" Thread.stop end end end # スレッド2の作成 t2 = Thread.new do # 処理を5回繰り返す for num in 1..5 do puts "thread2" # 1秒スリープ sleep 1 end end t2.join puts "Thread1再開" t1.run t1.join puts "スレッドの終了"
実行結果:
スレッドの開始 thread1 thread2 thread1停止中 thread2 thread2 thread2 thread2 Thread1再会 thread1 thread1 thread1 スレッドの終了 thread1
まとめ
ここではRubyで同時並行で処理を実行するスレッド(Thread)について、以下の内容を解説しました。
- そもそもThreadとは
- Threadの使い方
- Threadを終了する方法
- Threadの停止と再会
Threadの処理は同時並行で別々の処理が実行できるため非常に便利です。
もし、Threadの使い方を忘れてしまったら、この記事を思い出してくださいね!