線程表示輕量級(jí)的子進(jìn)程。 它是一個(gè)單獨(dú)的執(zhí)行路徑。 在Ruby中,程序的不同部分可以通過(guò)使用多個(gè)進(jìn)程在不同程序之間使用多個(gè)線程執(zhí)行,或拆分程序中的任務(wù)來(lái)同時(shí)運(yùn)行。
Ruby中的線程是并發(fā)編程模型的實(shí)現(xiàn)。
一般情況下,一個(gè)正常的程序的執(zhí)行路徑是單線執(zhí)行。 按編碼的順序執(zhí)行程序中的所有語(yǔ)句。
但是在多線程程序中,可以按多個(gè)路徑多個(gè)執(zhí)行程序。 多線程使用較少的內(nèi)存空間并共享相同的地址空間。 多線程用于一次執(zhí)行多個(gè)任務(wù)。
使用thread.new調(diào)用創(chuàng)建一個(gè)新線程。它與主線程的執(zhí)行不同。
要?jiǎng)?chuàng)建一個(gè)新的線程Ruby提供了三個(gè)關(guān)鍵字,即::new,::start和::fork。
要啟動(dòng)新線程,請(qǐng)將一個(gè)代碼塊調(diào)用Thread.new,Thread.start或Thread.fork相關(guān)聯(lián)。這樣線程將被創(chuàng)建,新的線程在塊退出時(shí)退出。
語(yǔ)法:
# Original thread runs
Thread.new {
# New thread is created.
}
# Original thread runs
在Ruby中終止一個(gè)線程有不同的方法。 要退出給定的線程,使用類名 ::kill 方法。
語(yǔ)法:
thr = Thread.new { ... }
Thread.kill(thr)
#!/usr/bin/ruby
# file : thread-example.rb
th = Thread.new do #Here we start a new thread
Thread.current['counter']=0
5.times do |i| #loop starts and increases i each time
Thread.current['counter']=i
sleep 1
end
return nil
end
while th['counter'].to_i < 4 do
=begin
th is the long running thread
and we can access the same variable
from inside the thread here
=end
puts "Counter is #{th['counter']}"
sleep 0.5
end
puts "Long running process finished!"
執(zhí)行上面代碼,輸出以下結(jié)果 -
F:\worksp\ruby>ruby thread-example.rb
Counter is
Counter is 0
Counter is 1
Counter is 1
Counter is 2
Counter is 2
Counter is 3
Counter is 3
Long running process finished!
F:\worksp\ruby>
線程創(chuàng)建完成后,無(wú)需啟動(dòng)線程。 它獲得正確的CPU資源后自動(dòng)運(yùn)行。 塊中的最后一個(gè)表達(dá)式是線程的值。 如果線程完全運(yùn)行,則value方法返回線程值,否則,value方法阻塞,并在線程完成時(shí)返回。 線程類在運(yùn)行查詢和操作線程時(shí)定義了一些方法。
通過(guò)調(diào)用線程的Thread.join方法,可以等待一個(gè)特定的線程完成。
線程可能也會(huì)有一些異常。異常發(fā)生在主線程以外的任何線程中,但這取決于abort_on_exception。 默認(rèn)情況下,此選項(xiàng)始終為false。表示未處理的異常將靜默地終止線程。 這可以通過(guò)將abort_on_exception = true或$DEBUG設(shè)置為true來(lái)更改。
要處理異常,可以使用類的::handle_interrupt方法。 它將使用線程異步處理異常。
在塊上創(chuàng)建線程。 在塊內(nèi)創(chuàng)建的局部變量?jī)H可在該塊存在的線程中訪問(wèn)。
Ruby線程類允許通過(guò)名稱創(chuàng)建和訪問(wèn)線程局部變量。 線程對(duì)象像哈希一樣處理,使用[]=寫入元素,并使用[]讀取它們。
Ruby支持通過(guò)在程序中使用::stop和::pass方法調(diào)度線程。
類的::stop方法將當(dāng)前正在運(yùn)行的線程置于休眠狀態(tài)并調(diào)度另一個(gè)線程的執(zhí)行。 一旦線程處于休眠狀態(tài),實(shí)例方法喚醒被用來(lái)標(biāo)記線程符合調(diào)度條件。
類的::pass方法嘗試將執(zhí)行傳遞給另一個(gè)線程。 這取決于操作系統(tǒng)運(yùn)行的線程是否切換。
線程優(yōu)先級(jí)提供了根據(jù)優(yōu)先級(jí)調(diào)度線程的操作。 高優(yōu)先級(jí)線程首先安排執(zhí)行。 它也取決于操作系統(tǒng)。 線程可以隨著第一個(gè)動(dòng)作增加或減少自己的優(yōu)先級(jí)。
Ruby線程排除的狀態(tài),當(dāng)兩個(gè)線程共享相同的數(shù)據(jù)并且其中一個(gè)線程修改該數(shù)據(jù)時(shí),需要確保在沒(méi)有線程操作數(shù)據(jù)處于不一致的狀態(tài)。 例如,銀行服務(wù)器。 一個(gè)線程在賬戶中進(jìn)行匯款,其他線程正在為客戶生成月度報(bào)表。
| 方法 | 描述 |
|---|---|
| abort_on_exception | 它返回全局“異常中止”狀態(tài),默認(rèn)值為true。 當(dāng)它設(shè)置為true時(shí),如果在任何線程中引發(fā)異常時(shí),則所有線程將中止。 |
| abort_on_exception= | 當(dāng)設(shè)置為true時(shí),如果引發(fā)異常,所有線程將中止。 它返回新的狀態(tài)。 |
| current | 它返回當(dāng)前執(zhí)行的線程。 |
| exclusive{block} | 它將塊封裝在一個(gè)單獨(dú)的塊中,返回塊的值。 |
| exit | 它終止當(dāng)前運(yùn)行的線程并計(jì)劃另一個(gè)線程運(yùn)行。 |
| kill(thread) | 它使指定的線程退出。 |
fork([args]*){args / block} |
它與::new方法基本相同。 |
| handle_interrupt(hash){…} | 更改異步中斷時(shí)序。 |
| list | 返回可運(yùn)行或停止的所有線程的線程對(duì)象數(shù)組。 |
| main | 返回主線程 |
new{...}/ new(*args, &proc)/ new(*args){/args/...} |
它創(chuàng)建一個(gè)執(zhí)行給定塊的新線程。 |
| pass | 它給線程調(diào)度程序一個(gè)提示,以將執(zhí)行傳遞給另一個(gè)線程。 運(yùn)行的線程可能會(huì)或可能不會(huì)根據(jù)操作系統(tǒng)進(jìn)行切換。 |
| pending_interrupt?(error = nil) | 它返回異步隊(duì)列是否為空? |
start([args]*){/args/block} |
它與::new方法基本相同。 |
| stop | 它停止執(zhí)行當(dāng)前線程,將其置于“睡眠”狀態(tài),并計(jì)劃執(zhí)行另一個(gè)線程。 |
| 方法 | 描述 |
|---|---|
| thr[sym] | 它使用字符串或符號(hào)名稱返回局部變量的值。 |
| thr[sym]= | 它使用字符串或符號(hào)名稱創(chuàng)建局部變量的值。 |
| abort_on_exception | 它返回第三個(gè)“異常中止”的狀態(tài)。 |
| abort_on_exception= | 當(dāng)設(shè)置為true時(shí),如果在此thr中引發(fā)異常,所有線程將中止。 |
| add_trace_func(proc) | 添加proc作為跟蹤的處理程序。 |
| alive? | 如果此thr運(yùn)行或睡眠,則返回true。 |
| backtrace | 它返回目標(biāo)的追溯目標(biāo)。 |
backtrace_locations(*args) |
它返回前面的目標(biāo)的執(zhí)行堆棧。 |
| exit/kill/terminate | 它終止thr并執(zhí)行另一個(gè)線程運(yùn)行。 |
| group | 它返回包含給定線程的ThreadGroup,或返回nil。 |
| inspect | 它將返回thr的字符串名稱,id和狀態(tài)。 |
| join | 調(diào)用線程將暫停執(zhí)行并運(yùn)行此thr。 |
| key?(sym) | 如果給定的字符串作為thr局部變量存在,則返回true。 |
| keys | 它返回一個(gè)thr局部變量名稱的數(shù)組。 |
| pending_interrupt?(error=nil) | 判斷返回目標(biāo)線程的異步隊(duì)列是否為空。 |
| priority | 它返回thr的優(yōu)先級(jí)。 |
| priority= | 它將thr的優(yōu)先級(jí)設(shè)置為一個(gè)整數(shù)。 |
| kill | 它與exit方法一樣。 |
| raise | 它引發(fā)了給定線程的異常。 |
| run | 它喚醒了thr,使其可調(diào)度。 |
| safe_level | 它返回安全級(jí)別。 |
| set_trace_func(proc) | 它作為處理程序在thr上建立proc。 |
| status | 它返回thr的狀態(tài)。 |
| stop? | 如果thr休眠或終止,則返回true。 |
| terminate | 它終止thr并計(jì)劃另一個(gè)線程運(yùn)行。 |
| thread_variable?(key) | 如果給定的字符串作為線程局部變量存在,則返回true。 |
| thread_variable_get(key) | 它返回已設(shè)置的線程局部變量的值。 |
| thread_variable_set(key, value) | 設(shè)置一個(gè)線程的局部鍵和值。 |
| thread_variable | 它返回線程局部變量的數(shù)組。 |
| value | 它等待thr完成,使用join并返回其值。 |
| wakeup | 使給定線程有資格進(jìn)行調(diào)度,盡管它仍然可能在I/O上阻塞。 |