はじめてのRuby!並列処理Threadの使い方をやさしく解説!

プログラミングにおいて別々の処理を同時並行で実施するスレッド(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の使い方を忘れてしまったら、この記事を思い出してくださいね!

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次