国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Ruby > 正文

講解Ruby編程中的多線程

2020-02-24 15:38:34
字體:
供稿:網(wǎng)友

在Ruby中,我們可以通過線程類創(chuàng)建多線程,Ruby的線程很輕,可以有效地實(shí)現(xiàn)并行代碼,多線程在一個(gè)程序中同時(shí)運(yùn)行以完成不同的任務(wù)稱為多線程,本文是武林技術(shù)頻道小編和大家分享的講解Ruby編程中的多線程。
創(chuàng)建 Ruby 線程

要啟動(dòng)一個(gè)新的線程,只需要調(diào)用 Thread.new 即可:

ruby;"># 線程 #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,同樣可以以同樣的語法使用Thread.start 或者Thread.fork這三個(gè)方法來創(chuàng)建線程。

2、創(chuàng)建線程后無需啟動(dòng),線程會(huì)自動(dòng)執(zhí)行。

3、Thread 類定義了一些方法來操控線程。線程執(zhí)行Thread.new中的代碼塊。

4、線程代碼塊中最后一個(gè)語句是線程的值,可以通過線程的方法來調(diào)用,如果線程執(zhí)行完畢,則返回線程值,否則不返回值直到線程執(zhí)行完畢。

5、Thread.current 方法返回表示當(dāng)前線程的對象。 Thread.main 方法返回主線程。

6、通過 Thread.Join 方法來執(zhí)行線程,這個(gè)方法會(huì)掛起主線程,直到當(dāng)前線程執(zhí)行完畢。
線程狀態(tài)

線程有5種狀態(tài):

2015410100905173.jpg (800×258)

線程和異常

當(dāng)某線程發(fā)生異常,且沒有被rescue捕捉到時(shí),該線程通常會(huì)被無警告地終止。但是,若有其它線程因?yà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對指定的線程設(shè)定標(biāo)志。

當(dāng)使用上述3種方法之一后,整個(gè)解釋器就會(huì)被中斷。

t = Thread.new { ... }t.abort_on_exception = true

線程同步控制

在Ruby中,提供三種實(shí)現(xiàn)同步的方式,分別是:

1. 通過Mutex類實(shí)現(xiàn)線程同步

2. 監(jiān)管數(shù)據(jù)交接的Queue類實(shí)現(xiàn)線程同步

3. 使用ConditionVariable實(shí)現(xiàn)同步控制
通過Mutex類實(shí)現(xiàn)線程同步

通過Mutex類實(shí)現(xiàn)線程同步控制,如果在多個(gè)線程鐘同時(shí)需要一個(gè)程序變量,可以將這個(gè)變量部分使用lock鎖定。 代碼如下:

#encoding:gbkrequire "thread"puts "Synchronize Thread" @num=200@mutex=Mutex.new def buyTicket(num)  @mutex.lock    if @num>=num      @num=@num-num      puts "you have successfully bought #{num} tickets"    else      puts "sorry,no enough tickets"    end  @mutex.unlockend ticket1=Thread.new 10 do  10.times do |value|  ticketNum=15  buyTicket(ticketNum)  sleep 0.01  endend ticket2=Thread.new 10 do  10.times do |value|  ticketNum=20  buyTicket(ticketNum)  sleep 0.01  endend sleep 1ticket1.jointicket2.join

輸出結(jié)果如下:

Synchronize Threadyou have successfully bought 15 ticketsyou have successfully bought 20 ticketsyou have successfully bought 15 ticketsyou have successfully bought 20 ticketsyou have successfully bought 15 ticketsyou have successfully bought 20 ticketsyou have successfully bought 15 ticketsyou have successfully bought 20 ticketsyou have successfully bought 15 ticketsyou have successfully bought 20 ticketsyou have successfully bought 15 ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough tickets

除了使用lock鎖定變量,還可以使用try_lock鎖定變量,還可以使用Mutex.synchronize同步對某一個(gè)變量的訪問。
監(jiān)管數(shù)據(jù)交接的Queue類實(shí)現(xiàn)線程同步

Queue類就是表示一個(gè)支持線程的隊(duì)列,能夠同步對隊(duì)列末尾進(jìn)行訪問。不同的線程可以使用統(tǒng)一個(gè)對類,但是不用擔(dān)心這個(gè)隊(duì)列中的數(shù)據(jù)是否能夠同步,另外使用SizedQueue類能夠限制隊(duì)列的長度

SizedQueue類能夠非常便捷的幫助我們開發(fā)線程同步的應(yīng)用程序,應(yīng)為只要加入到這個(gè)隊(duì)列中,就不用關(guān)心線程的同步問題。

經(jīng)典的生產(chǎn)者消費(fèi)者問題:

#encoding:gbkrequire "thread"puts "SizedQuee Test" queue = Queue.new producer = Thread.new do  10.times do |i|    sleep rand(i) # 讓線程睡眠一段時(shí)間    queue << i    puts "#{i} produced"  endend consumer = Thread.new do  10.times do |i|    value = queue.pop    sleep rand(i/2)    puts "consumed #{value}"  endend consumer.join程序的輸出:SizedQuee Test0 produced1 producedconsumed 02 producedconsumed 1consumed 23 producedconsumed 34 produced consumed 45 producedconsumed 56 producedconsumed 67 producedconsumed 78 produced9 producedconsumed 8consumed 9

使用ConditionVariable實(shí)現(xiàn)同步控制

使用 ConditonVariable進(jìn)行同步控制,能夠在一些致命的資源競爭部分掛起線程直到有可用的資源為止。

#encoding:gbkrequire "thread"puts "thread synchronize by ConditionVariable" mutex = Mutex.newresource = ConditionVariable.new a = Thread.new {  mutex.synchronize {    # 這個(gè)線程目前需要resource這個(gè)資源    resource.wait(mutex)    puts "get resource"  }} b = Thread.new {  mutex.synchronize {    #線程b完成對resourece資源的使用并釋放resource    resource.signal  }} a.joinputs "complete"

mutex 是聲明的一個(gè)資源,然后通過ConditionVariable來控制申請和釋放這個(gè)資源。

b 線程完成了某些工作之后釋放資源resource.signal,這樣a線程就可以獲得一個(gè)mutex資源然后進(jìn)行執(zhí)行。 執(zhí)行結(jié)果:

thread synchronize by ConditionVariableget resourcecomplete

線程類方法

完整的 Thread(線程) 類方法如下:


線程實(shí)例化方法

以下實(shí)例調(diào)用了線程實(shí)例化方法 join:

#!/usr/bin/ruby thr = Thread.new do  # 實(shí)例化  puts "In second thread"  raise "Raise exception"endthr.join  # 調(diào)用實(shí)例化方法 join

以下是完整實(shí)例化方法列表:

2015410101902229.jpg (927×742)

2015410101949440.jpg (937×179)線程實(shí)例化方法

以下實(shí)例調(diào)用了線程實(shí)例化方法 join:

#!/usr/bin/ruby thr = Thread.new do  # 實(shí)例化  puts "In second thread"  raise "Raise exception"endthr.join  # 調(diào)用實(shí)例化方法 join

以下是完整實(shí)例化方法列表:

2015410102030312.jpg (936×726)

2015410102049794.jpg (936×451)

通過以上的介紹,相信大家已經(jīng)明了講解Ruby編程中的多線程,不過在實(shí)際操作的時(shí)候,程序員一定要謹(jǐn)慎,選擇武林技術(shù)頻道網(wǎng)進(jìn)行學(xué)習(xí),會(huì)讓您受益匪淺哦!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 襄垣县| 大关县| 和田县| 大关县| 金溪县| 汉寿县| 长海县| 公主岭市| 青冈县| 西盟| 大荔县| 潞西市| 冀州市| 和平县| 连江县| 江口县| 昌黎县| 弥勒县| 云浮市| 西吉县| 泾阳县| 台南县| 罗甸县| 台东县| 高密市| 庆阳市| 沾化县| 会宁县| 绥芬河市| 老河口市| 塔河县| 搜索| 延吉市| 三门县| 太湖县| 永康市| 扎鲁特旗| 卢龙县| 汶上县| 赤城县| 繁昌县|