📜  红宝石 |线程生命周期及其状态(1)

📅  最后修改于: 2023-12-03 14:56:49.117000             🧑  作者: Mango

红宝石 | 线程生命周期及其状态

线程是现代计算机中必不可少的一员,不仅已经成为多任务处理的重要手段,还广泛用于分布式系统和多核心处理器中的并发编程。在 Ruby 中,线程同样是非常实用和简便的,让我们来深入了解一下线程的生命周期和它的状态。

线程生命周期

在 Ruby 中,线程的生命周期通常包括以下几个阶段:

  1. 创建(Creation):在程序中使用 Thread.newThread.start 方法来创建一个新的线程。

  2. 就绪(Ready):当创建一个新线程并且它已经被加入到就绪队列中时,它就处于就绪状态。此时,线程会等待 Ruby 运行时的调度器从就绪队列中选中它,然后将其转移到运行状态。

  3. 运行(Running):一旦线程被选中并从就绪队列中移出,则进入运行状态。在运行时,Ruby 运行时环境会执行线程中的代码,直到线程完成了其全部工作并进入了终止状态。

  4. 阻塞(Blocked):在某些情况下,线程会被阻塞。例如,当线程需要等待 IO 操作完成时,它就会进入阻塞状态。当 IO 操作完成后,线程就会被移动回就绪状态并等待调度器的下一次调用。

  5. 终止(Termination):当线程完成其分配的任务、主动退出或发生异常时,线程将进入终止状态。

线程状态

除了线程的生命周期外,Ruby 还提供了一些可供检查和控制线程状态的方法:

  1. Thread.current.status:用于查询当前线程的状态。

  2. Thread.stop?:用于检查线程是否被暂停,即是否在阻塞状态。

  3. Thread.abort_on_exception=:用于设置是否在线程发生异常时立即停止程序。

下面我们来一一介绍这些方法:

Thread.current.status

这个方法可以返回当前线程的状态,即一个字符串表示。其返回值包括:

  • "run" 表示线程正在运行
  • "sleep" 表示线程正在睡眠
  • "aborting" 表示线程正在终止
  • "false" 表示线程已经完成工作
puts "Main thread status: #{Thread.current.status}"

Thread.new {
  puts "New thread status: #{Thread.current.status}"
}.join

输出为:

Main thread status: run
New thread status: run
Thread.stop?

这个方法可以检查线程是否被暂停,即是否在等待某些操作的完成或事件的发生。例如:

Thread.new {
  loop do 
    puts "Child thread is working ..."
    Thread.stop if Time.now.to_i.even?
  end
}

Thread.list.each(&:run) # 启动所有线程

sleep 1 until Thread.current.status == "run" # 等待子线程初始化

puts "Main thread is working ..."
sleep 10
puts "Main thread is done"

输出为:

Child thread is working ...
Child thread is working ...
Main thread is working ...
Child thread is working ...
Child thread is working ...
Main thread is working ...
Child thread is working ...
Child thread is working ...
Main thread is working ...
Main thread is done

这个例子中,我们创建了一个子线程,它每隔一秒钟打印一次 "Child thread is working ..."。当时间戳为偶数时,子线程会暂停。而主线程则是每隔一秒钟打印一次 "Main thread is working ..."。最后,主线程会睡眠十秒钟,然后完成。根据输出结果可以看到,线程在不断的切换状态,子线程在打印内容之间间隔等待。

Thread.abort_on_exception=

这个方法可以设置是否在线程发生异常时立即停止程序。例如:

Thread.abort_on_exception = true

Thread.new {
  puts "Child thread is working ..."
  raise "Oops! Something went wrong ..."
}

sleep 1 until Thread.current.status == "run" # 等待子线程初始化

puts "Main thread is working ..."

输出为:

Child thread is working ...
Exception `RuntimeError' at (eval):4 - Oops! Something went wrong ...
(eval):4:in `block in <main>': Oops! Something went wrong ... (RuntimeError)
  from (eval):2:in `join'
  from (eval):2:in `<main>'

这个例子中,我们设置了 Thread.abort_on_exception = true,这表示如果子线程发生了异常,整个程序将会立即停止。最后,子线程会抛出一个运行异常,导致运行时错误并停止程序。

总结

线程是 Ruby 中非常实用的工具,它可以用于并发编程和分布式计算等各种场景。线程的生命周期和状态以及相关方法在 Ruby 中非常精细,开发者可以根据需求自由控制每个线程的运行。