每個(gè)正在系統(tǒng)上運(yùn)行的程序都是一個(gè)進(jìn)程。每個(gè)進(jìn)程包含一到多個(gè)線程。
線程是程序中一個(gè)單一的順序控制流程,在單個(gè)程序中同時(shí)運(yùn)行多個(gè)線程完成不同的工作,稱為多線程。
Ruby 中我們可以通過(guò) Thread 類來(lái)創(chuàng)建多線程,Ruby的線程是一個(gè)輕量級(jí)的,可以以高效的方式來(lái)實(shí)現(xiàn)并行的代碼。
創(chuàng)建 Ruby 線程
要啟動(dòng)一個(gè)新的線程,只需要調(diào)用 Thread.new 即可:
# 線程 #1 代碼部分Thread.new { # 線程 #2 執(zhí)行代碼}# 線程 #1 執(zhí)行代碼
實(shí)例
以下實(shí)例展示了如何在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}"
以上代碼執(zhí)行結(jié)果為:
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、線程的創(chuàng)建可以使用Thread.new,同樣可以以同樣的語(yǔ)法使用Thread.start 或者Thread.fork這三個(gè)方法來(lái)創(chuàng)建線程。
2、創(chuàng)建線程后無(wú)需啟動(dòng),線程會(huì)自動(dòng)執(zhí)行。
3、Thread 類定義了一些方法來(lái)操控線程。線程執(zhí)行Thread.new中的代碼塊。
4、線程代碼塊中最后一個(gè)語(yǔ)句是線程的值,可以通過(guò)線程的方法來(lái)調(diào)用,如果線程執(zhí)行完畢,則返回線程值,否則不返回值直到線程執(zhí)行完畢。
5、Thread.current 方法返回表示當(dāng)前線程的對(duì)象。 Thread.main 方法返回主線程。
6、通過(guò) Thread.Join 方法來(lái)執(zhí)行線程,這個(gè)方法會(huì)掛起主線程,直到當(dāng)前線程執(zhí)行完畢。
線程狀態(tài)
線程有5種狀態(tài):
線程和異常
當(dāng)某線程發(fā)生異常,且沒(méi)有被rescue捕捉到時(shí),該線程通常會(huì)被無(wú)警告地終止。但是,若有其它線程因?yàn)門(mén)hread#join的關(guān)系一直等待該線程的話,則等待的線程同樣會(huì)被引發(fā)相同的異常。
begin t = Thread.new do Thread.pass # 主線程確實(shí)在等join raise "unhandled exception" end t.joinrescue p $! # => "unhandled exception"end
使用下列3個(gè)方法,就可以讓解釋器在某個(gè)線程因異常而終止時(shí)中斷運(yùn)行。
啟動(dòng)腳本時(shí)指定-d選項(xiàng),并以調(diào)試模時(shí)運(yùn)行。 用Thread.abort_on_exception設(shè)置標(biāo)志。 使用Thread#abort_on_exception對(duì)指定的線程設(shè)定標(biāo)志。
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注