当前位置:K88软件开发文章中心编程全书编程全书03 → 文章内容

Ruby 多线程

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-11 12:58:55

w {sleep(rand(0)/10.0)Thread.current["mycount"] = countcount += 1}endarr.each {|t| t.join; print t["mycount"], ", " }puts "count =





#{count}"以上代码运行输出结果为:8, 0, 3, 7, 2, 1, 6, 5, 4, 9, count = 10主线程等待子线程执行完成,然后分别输出每个值。。线程优先级线程的优先级是影响线程的调度的主要因素。其他因素包括占用CPU的执行时间长短,线程分组调度等等。可以使用 Thread.priority 方法得到线程的优先级和使用 Thread.priority= 方法来调整线程的优先级。线程的优先级默认为 0 。 优先级较高的执行的要快。一个 Thread 可以访问自己作用域内的所有数据,但如果有需要在某个线程内访问其他线程的数据应该怎么做呢? Thread 类提供了线程数据互相访问的方法,你可以简单的把一个线程作为一个 Hash 表,可以在任何线程内使用 []= 写入数据,使用 [] 读出数据。athr = Thread.new { Thread.current["name"] = "Thread A"; Thread.stop }bthr = Thread.new { Thread.current["name"] = "Thread B"; Thread.stop }cthr = Thread.new { Thread.current["name"] = "Thread C"; Thread.stop }Thread.list.each {|x| puts "





#{x.inspect}:











#{x["name"]}" }可以看到,把线程作为一个 Hash 表,使用 [] 和 []= 方法,我们实现了线程之间的数据共享。线程互斥Mutex(Mutal Exclusion = 互斥锁)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。不使用Mutax的实例实例





#!/usr/bin/rubyrequire 'thread'count1 = count2 = 0difference = 0counter = Thread.new doloop docount1 += 1count2 += 1endendspy = Thread.new doloop dodifference += (count1 - count2).absendendsleep 1puts "count1 :











#{count1}"puts "count2 :











#{count2}"puts "difference :











#{difference}"以上实例运行输出结果为:count1 :





9712487count2 :





12501239difference :





0使用Mutax的实例实例





#!/usr/bin/rubyrequire 'thread'mutex = Mutex.newcount1 = count2 = 0difference = 0counter = Thread.new doloop domutex.synchronize docount1 += 1count2 += 1endendendspy = Thread.new doloop domutex.synchronize dodifference += (count1 - count2).absendendendsleep 1mutex.lockputs "count1 :











#{count1}"puts "count2 :











#{count2}"puts "difference :











#{difference}"以上实例运行输出结果为:count1 :





1336406count2 :





1336406difference :





0死锁两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,这种状况,就称为死锁。例如,一个进程 p1占用了显示器,同时又必须使用打印机,而打印机被进程p2占用,p2又必须使用显示器,这样就形成了死锁。当我们在使用 Mutex 对象时需要注意线程死锁。实例





#!/usr/bin/rubyrequire 'thread'mutex = Mutex.newcv = ConditionVariable.newa = Thread.new {mutex.synchronize {puts "A:





I have critical section, but will wait for cv"cv.wait(mutex)puts "A:





I have critical section again! I rule!"}}puts "(Later, back at the ranch...)"b = Thread.new {mutex.synchronize {puts "B:





Now I am critical, but am done with cv"cv.signalputs "B:





I am still critical, finishing up"}}a.joinb.join以上实例输出结果为:A:





I have critical section, but will wait for cv(Later, back at the ranch...)B:





Now I am critical, but am done with cvB:





I am still critical, finishing upA:





I have critical section again! I rule!线程类方法完整的 Thread(线程) 类方法如下:序号方法描述1Thread.abort_on_exception若其值为真的话,一旦某线程因异常而终止时,整个解释器就会被中断。它的默认值是假,也就是说,在通常情况下,若某线程发生异常且该异常未被Thread





#join等检测到时,该线程会被无警告地终止。2Thread.abort_on_exception=如果设置为 true, 一旦某线程因异常而终止时,整个解释器就会被中断。返回新的状态3Thread.critical返回布尔值。4Thread.critical=当其值为true时,将不会进行线程切换。若当前线程挂起(stop)或有信号(signal)干预时,其值将自动变为false。5Thread.current返回当前运行中的线程(当前线程)。6Thread.exit终止当前线程的运行。返回当前线程。若当前线程是唯一的一个线程时,将使用exit(0)来终止它的运行。7Thread.fork { block }与 Thread.new 一样生成线程。8Thread.kill( aThread )终止线程的运行.9Thread.list返回处于运行状态或挂起状态的活线程的数组。10Thread.main返回主线程。11Thread.new( [ arg ]* ) {| args | block }生成线程,并开始执行。数会被原封不动地传递给块. 这就可以在启动线程的同时,将值传递给该线程所固有的局部变量。12Thread.pass将运行权交给其他线程. 它不会改变运行中的线程的状态,而是将控制权交给其他可运行的线程(显式的线程调度)。13Thread.start( [ args ]* ) {| args | block }生成线程,并开始执行。数会被原封不动地传递给块. 这就可以在启动线程的同时,将值传递给该线程所固有的局部变量。14Thread.stop将当前线程挂起,直到其他线程使用run方法再次唤醒该线程。线程实例化方法以下实例调用了线程实例化方法 join:实例





#!/usr/bin/rubythr = Thread.new do





# 实例化puts "In second thread"raise "Raise exception"endthr.join





# 调用实例化方法 join以下是完整实例化方法列表:序号方法描述1thr[ name ]取出线程内与name相对应的固有数据。 name可以是字符串或符号。若没有与name相对应的数据时, 返回nil。2thr[ name ] =设置线程内name相对应的固有数据的值, name可以是字符串或符号。 若设为nil时, 将删除该线程内对应数据。3thr.abort_on_exception返回布尔值。4thr.abort_on_exception=若其值为true的话,一旦某线程因异常而终止时,整个解释器就会被中断。5thr.alive?若线程是"活"的,就返回true。6thr.exit终止线程的运行。返回self。7thr.join挂起当前线程,直到self线程终止运行为止. 若self因异常而终止时, 将会当前线程引发同样的异常。8thr.key?若与name相对应的线程固有数据已经被定义的话,就返回true9thr.kill类似于 Thread.exi

上一页  [1] [2] [3]  下一页


Ruby 多线程