線程的創(chuàng)建可以使用Thread.new,Thread.start 或者Thread.fork來(lái)創(chuàng)建線程卫漫。例如thread = Thread.new {}。
i=1
thread1=Thread.start 10 do |value| while i<value puts "#{i}" i=i+1 end end thread1.join thread2=Thread.start do 10.times do |a| puts "the #{a+1} output" end end thread2.join
線程thread1線程創(chuàng)建以后肾砂,調(diào)用了thread1.join方法掛起主線程列赎,等待thread1線程完成,這樣就能在主線程結(jié)束之前看到線程thread1,thread2的輸出消息镐确。
但是這樣可以看到包吝,線程的輸出是等到線程thread1完全執(zhí)行完畢以后才執(zhí)行線程thread2,線程的調(diào)度是隨機(jī)的,所以如果沒有thread1.join和thread2.join兩個(gè)方法辫塌,線程的輸出就會(huì)變得沒有規(guī)律
通過(guò)Thread.current方法可以獲得線程的id漏策。
i=1 thread1=Thread.start 10 do |value| while i<value id=Thread.current puts "#{i} 當(dāng)前執(zhí)行的線程id:#{id}\n" i=i+1 end end thread2=Thread.start do 10.times do |a| id=Thread.current puts "the #{a+1} 當(dāng)前執(zhí)行的線程id:#{id}\n" end end thread1.join thread2.join
線程的停止
可以使用Thread.exit停止當(dāng)前線程。
i=1 thread1=Thread.start 10 do |value| while i<value puts "#{i} \n" i=i+1 if i>3 Thread.exit end end end thread1.join
當(dāng)thead1線程中i超過(guò)3以后臼氨,結(jié)束那個(gè)線程掺喻。
同時(shí)線程的結(jié)束還可以使用Thread.pass。
使用sleep函數(shù)讓線程休眠
i=1 puts "hello thread" puts Time.new thread1=Thread.start 10 do |value| sleep 3 while i<value puts "#{i} \n" i=i+1 end end thread1.join
可以使用 Thread.current 方法來(lái)訪問(wèn)當(dāng)前線程
使用 Thread.list 方法列出所有線程储矩;
可以使用Thread.status 和 Thread.alive? 方法得到線程的狀態(tài)感耙;
可以使用 Thread.priority 方法得到線程的優(yōu)先級(jí)和使用 Thread.priority= 方法來(lái)調(diào)整線程的優(yōu)先級(jí),默認(rèn)為0,可以設(shè)置為-1持隧,-2等
數(shù)據(jù)互訪
Thread 類提供了線程數(shù)據(jù)互相訪問(wèn)的方法即硼,你可以簡(jiǎn)單的把一個(gè)線程作為一個(gè) Hash 表,可以在任何線程內(nèi)使用 []=寫入數(shù)據(jù)屡拨,使用 []讀出數(shù)據(jù)只酥。
`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"]}" }'
可以看到,把線程作為一個(gè) Hash 表呀狼,使用 [] 和 []= 方法裂允,我們實(shí)現(xiàn)了線程之間的數(shù)據(jù)共享。