Ruby 2.4.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Threadクラス > pending_interrupt?

singleton method Thread.pending_interrupt?

pending_interrupt?(error = nil) -> bool[permalink][rdoc]

非同期割り込みのキューが空かどうかを返します。

Thread.handle_interrupt は非同期割り込みの発生を延期させるのに使用しますが、本メソッドは任意の非同期割り込みが存在するかどうかを確認するのに使用します。

本メソッドが true を返した場合、Thread.handle_interrupt で例外の発生を延期するブロックを終了すると延期させられていた例外を発生させることができます。

[PARAM] error:
対象の例外クラスを指定します。省略した場合は全ての例外を対象に確認を行います。

例: 延期させられていた例外をただちに発生させる。

def Thread.kick_interrupt_immediately
  Thread.handle_interrupt(Object => :immediate) {
    Thread.pass
  }
end

使い方

th = Thread.new{
  Thread.handle_interrupt(RuntimeError => :on_blocking){
    while true
      ...
      # ここまでで割り込みが発生しても安全な状態になった。
      if Thread.pending_interrupt?
        Thread.handle_interrupt(Object => :immediate){}
      end
      ...
    end
  }
}
...
th.raise # スレッド停止。

この例は以下のように記述する事もできます。

flag = true
th = Thread.new{
  Thread.handle_interrupt(RuntimeError => :on_blocking){
    while true
      ...
      # ここまでで割り込みが発生しても安全な状態になった。
      break if flag == false
      ...
    end
  }
}
...
flag = false # スレッド停止

[SEE_ALSO] Thread#pending_interrupt?, Thread.handle_interrupt