每個正在系統上運行的程序都是一個進程。每個進程包含一到多個線程。
線程是程序中一個單一的順序控制流程,在單個程序中同時運行多個線程完成不同的工作,稱為多線程。
Ruby 中我們可以通過 Thread 類來創建多線程,Ruby的線程是一個輕量級的,可以以高效的方式來實現并行的代碼。
創建 Ruby 線程
要啟動一個新的線程,只需要調用 Thread.new 即可:
# 線程 #1 代碼部分Thread.new { # 線程 #2 執行代碼}# 線程 #1 執行代碼
實例
以下實例展示了如何在Ruby程序中使用多線程:
#!/usr/bin/ruby def func1 i=0 while i<=2 puts "func1 at: #{Time.now}" sleep(2) i=i+1 endend def func2 j=0 while j<=2 puts "func2 at: #{Time.now}" sleep(1) j=j+1 endend puts "Started At #{Time.now}"t1=Thread.new{func1()}t2=Thread.new{func2()}t1.joint2.joinputs "End at #{Time.now}"
以上代碼執行結果為:
Started At Wed May 14 08:21:54 -0700 2014func1 at: Wed May 14 08:21:54 -0700 2014func2 at: Wed May 14 08:21:54 -0700 2014func2 at: Wed May 14 08:21:55 -0700 2014func1 at: Wed May 14 08:21:56 -0700 2014func2 at: Wed May 14 08:21:56 -0700 2014func1 at: Wed May 14 08:21:58 -0700 2014End at Wed May 14 08:22:00 -0700 2014
線程生命周期
1、線程的創建可以使用Thread.new,同樣可以以同樣的語法使用Thread.start 或者Thread.fork這三個方法來創建線程。
2、創建線程后無需啟動,線程會自動執行。
3、Thread 類定義了一些方法來操控線程。線程執行Thread.new中的代碼塊。
4、線程代碼塊中最后一個語句是線程的值,可以通過線程的方法來調用,如果線程執行完畢,則返回線程值,否則不返回值直到線程執行完畢。
5、Thread.current 方法返回表示當前線程的對象。 Thread.main 方法返回主線程。
6、通過 Thread.Join 方法來執行線程,這個方法會掛起主線程,直到當前線程執行完畢。
線程狀態
線程有5種狀態:
線程和異常
當某線程發生異常,且沒有被rescue捕捉到時,該線程通常會被無警告地終止。但是,若有其它線程因為Thread#join的關系一直等待該線程的話,則等待的線程同樣會被引發相同的異常。
begin t = Thread.new do Thread.pass # 主線程確實在等join raise "unhandled exception" end t.joinrescue p $! # => "unhandled exception"end
使用下列3個方法,就可以讓解釋器在某個線程因異常而終止時中斷運行。
啟動腳本時指定-d選項,并以調試模時運行。 用Thread.abort_on_exception設置標志。 使用Thread#abort_on_exception對指定的線程設定標志。新聞熱點
疑難解答