在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Ruby/ Ruby多線程編程
Ruby for循環(huán)
Ruby教程
Ruby文件I/O
Ruby迭代器
Ruby哈希
Ruby日期時間
Ruby類和對象
Ruby快速入門(30分鐘)
Ruby redo/retry語句
Ruby模塊
Ruby解析XML(REXML)
Ruby if-else語句
Ruby的功能特點
Ruby break/next語句
Ruby方法
Ruby是什么?
Ruby與Python比較
Ruby Case語句
Ruby目錄
Ruby范圍
Ruby異常
Ruby套接字編程(Socket)
Ruby字符串
Ruby安裝配置
Ruby運算符
Ruby while/do...while循環(huán)語句
Ruby第一個HelloWorld程序
Ruby until循環(huán)語句
Ruby注釋
Ruby塊
Ruby數(shù)據(jù)類型
Ruby面向對象
Ruby正則表達式
Ruby數(shù)組
Ruby變量
Ruby多線程編程

Ruby多線程編程

線程表示輕量級的子進程。 它是一個單獨的執(zhí)行路徑。 在Ruby中,程序的不同部分可以通過使用多個進程在不同程序之間使用多個線程執(zhí)行,或拆分程序中的任務來同時運行。

Ruby中的線程是并發(fā)編程模型的實現(xiàn)。

Ruby多線程

一般情況下,一個正常的程序的執(zhí)行路徑是單線執(zhí)行。 按編碼的順序執(zhí)行程序中的所有語句。
但是在多線程程序中,可以按多個路徑多個執(zhí)行程序。 多線程使用較少的內存空間并共享相同的地址空間。 多線程用于一次執(zhí)行多個任務。

使用thread.new調用創(chuàng)建一個新線程。它與主線程的執(zhí)行不同。

線程初始化

要創(chuàng)建一個新的線程Ruby提供了三個關鍵字,即::new,::start::fork。

要啟動新線程,請將一個代碼塊調用Thread.new,Thread.startThread.fork相關聯(lián)。這樣線程將被創(chuàng)建,新的線程在塊退出時退出。

語法:

# Original thread runs  
Thread.new {  
  # New thread is created.  
}  
# Original thread runs

線程終止

在Ruby中終止一個線程有不同的方法。 要退出給定的線程,使用類名 ::kill 方法。

語法:

thr = Thread.new { ... }  
Thread.kill(thr)

Ruby線程實例

#!/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í)行上面代碼,輸出以下結果 -

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)建完成后,無需啟動線程。 它獲得正確的CPU資源后自動運行。 塊中的最后一個表達式是線程的值。 如果線程完全運行,則value方法返回線程值,否則,value方法阻塞,并在線程完成時返回。 線程類在運行查詢和操作線程時定義了一些方法。

通過調用線程的Thread.join方法,可以等待一個特定的線程完成。

線程異常處理

線程可能也會有一些異常。異常發(fā)生在主線程以外的任何線程中,但這取決于abort_on_exception。 默認情況下,此選項始終為false。表示未處理的異常將靜默地終止線程。 這可以通過將abort_on_exception = true$DEBUG設置為true來更改。

要處理異常,可以使用類的::handle_interrupt方法。 它將使用線程異步處理異常。

線程變量和范圍

在塊上創(chuàng)建線程。 在塊內創(chuàng)建的局部變量僅可在該塊存在的線程中訪問。

Ruby線程類允許通過名稱創(chuàng)建和訪問線程局部變量。 線程對象像哈希一樣處理,使用[]=寫入元素,并使用[]讀取它們。

線程調度

Ruby支持通過在程序中使用::stop::pass方法調度線程。

類的::stop方法將當前正在運行的線程置于休眠狀態(tài)并調度另一個線程的執(zhí)行。 一旦線程處于休眠狀態(tài),實例方法喚醒被用來標記線程符合調度條件。

類的::pass方法嘗試將執(zhí)行傳遞給另一個線程。 這取決于操作系統(tǒng)運行的線程是否切換。

線程優(yōu)先級提供了根據(jù)優(yōu)先級調度線程的操作。 高優(yōu)先級線程首先安排執(zhí)行。 它也取決于操作系統(tǒng)。 線程可以隨著第一個動作增加或減少自己的優(yōu)先級。

線程排除

Ruby線程排除的狀態(tài),當兩個線程共享相同的數(shù)據(jù)并且其中一個線程修改該數(shù)據(jù)時,需要確保在沒有線程操作數(shù)據(jù)處于不一致的狀態(tài)。 例如,銀行服務器。 一個線程在賬戶中進行匯款,其他線程正在為客戶生成月度報表。

公共類方法

方法 描述
abort_on_exception 它返回全局“異常中止”狀態(tài),默認值為true。 當它設置為true時,如果在任何線程中引發(fā)異常時,則所有線程將中止。
abort_on_exception= 當設置為true時,如果引發(fā)異常,所有線程將中止。 它返回新的狀態(tài)。
current 它返回當前執(zhí)行的線程。
exclusive{block} 它將塊封裝在一個單獨的塊中,返回塊的值。
exit 它終止當前運行的線程并計劃另一個線程運行。
kill(thread) 它使指定的線程退出。
fork([args]*){args / block} 它與::new方法基本相同。
handle_interrupt(hash){…} 更改異步中斷時序。
list 返回可運行或停止的所有線程的線程對象數(shù)組。
main 返回主線程
new{...}/ new(*args, &proc)/ new(*args){/args/...} 它創(chuàng)建一個執(zhí)行給定塊的新線程。
pass 它給線程調度程序一個提示,以將執(zhí)行傳遞給另一個線程。 運行的線程可能會或可能不會根據(jù)操作系統(tǒng)進行切換。
pending_interrupt?(error = nil) 它返回異步隊列是否為空?
start([args]*){/args/block} 它與::new方法基本相同。
stop 它停止執(zhí)行當前線程,將其置于“睡眠”狀態(tài),并計劃執(zhí)行另一個線程。

公共實例方法

方法 描述
thr[sym] 它使用字符串或符號名稱返回局部變量的值。
thr[sym]= 它使用字符串或符號名稱創(chuàng)建局部變量的值。
abort_on_exception 它返回第三個“異常中止”的狀態(tài)。
abort_on_exception= 當設置為true時,如果在此thr中引發(fā)異常,所有線程將中止。
add_trace_func(proc) 添加proc作為跟蹤的處理程序。
alive? 如果此thr運行或睡眠,則返回true。
backtrace 它返回目標的追溯目標。
backtrace_locations(*args) 它返回前面的目標的執(zhí)行堆棧。
exit/kill/terminate 它終止thr并執(zhí)行另一個線程運行。
group 它返回包含給定線程的ThreadGroup,或返回nil。
inspect 它將返回thr的字符串名稱,id和狀態(tài)。
join 調用線程將暫停執(zhí)行并運行此thr。
key?(sym) 如果給定的字符串作為thr局部變量存在,則返回true
keys 它返回一個thr局部變量名稱的數(shù)組。
pending_interrupt?(error=nil) 判斷返回目標線程的異步隊列是否為空。
priority 它返回thr的優(yōu)先級。
priority= 它將thr的優(yōu)先級設置為一個整數(shù)。
kill 它與exit方法一樣。
raise 它引發(fā)了給定線程的異常。
run 它喚醒了thr,使其可調度。
safe_level 它返回安全級別。
set_trace_func(proc) 它作為處理程序在thr上建立proc。
status 它返回thr的狀態(tài)。
stop? 如果thr休眠或終止,則返回true。
terminate 它終止thr并計劃另一個線程運行。
thread_variable?(key) 如果給定的字符串作為線程局部變量存在,則返回true
thread_variable_get(key) 它返回已設置的線程局部變量的值。
thread_variable_set(key, value) 設置一個線程的局部鍵和值。
thread_variable 它返回線程局部變量的數(shù)組。
value 它等待thr完成,使用join并返回其值。
wakeup 使給定線程有資格進行調度,盡管它仍然可能在I/O上阻塞。