2009-02-11 14 views

cevap

2

Java'yı bilmediğim uyarıyla, yorumlarınıza dayanarak bir koşul değişkeni istediğinizi düşünüyorum. Google'ın "Ruby koşul değişkeni" için yararlı sayfalardan oluşan bir grup geliyor. first link I get, özellikle var olan koşullara hızlı bir şekilde girerken, this, Ruby'de dişli programlamanın çok daha geniş bir kapsamını veriyor gibi görünüyor.

+0

Java gibi bir şey, ruby'nin sinyal kullandığı ve java'nın kullandığı bildirimler hariç. Teşekkürler ! – Geo

0

Ben ne istediğini var notifyAll() için eşdeğer, ama diğer iki Thread.stop olan Thread#join

threads = [] 
10.times do 
    threads << Thread.new do 
    some_method(:foo) 
    end 
end 

threads.each { |thread| thread.join } #or threads.each(&:join) 

puts 'Done with all threads' 
+1

değil. Bir iş parçacığı yürütmeyi tamamlayana kadar bekler. Bekleyin, bildirilene kadar bir iş parçacığını duraklatır, böylece yürütmeye devam edebilir. – Geo

+0

Ah. Benim hatam. Aslında Java'yı bilmiyorum, böylece vahşi tahminim başarısız oldu. –

1

olduğunu düşünüyorum başlamak yapmak için durdurulmuş parçacığı üzerinde denir ve run ((cari parçacığı durdurur) tekrar gidiyor).

+2

ConditionVariable # yayınının notifyAll() ile eşdeğer olduğuna inanıyorum() – finnw

1

Sanırım böyle bir şey daha arıyorsun. Bu gerçekleştirildikten sonra başlatılan herhangi bir nesne üzerinde çalışacaktır. Mükemmel değil, özellikle Thread.stop muteks dışındaysa. Java'da, bir iş parçacığı beklerken, bir monitörü serbest bırakır. Aradığınız Ne

class Object 
    def wait 
    @waiting_threads = [] unless @waiting_threads 
    @monitor_mutex = Mutex.new unless @monitor_mutex 
    @monitor_mutex.synchronize { 
     @waiting_threads << Thread.current 
    } 
    Thread.stop 
    end 

    def notify 
    if @monitor_mutex and @waiting_threads 
     @monitor_mutex.synchronize { 
     @waiting_threads.delete_at(0).run unless @waiting_threads.empty? 
     } 
    end 
    end 

    def notify_all 
    if @monitor_mutex and @waiting_threads 
     @monitor_mutex.synchronize { 
     @waiting_threads.each {|thread| thread.run} 
     @waiting_threads = [] 
     } 
    end 
    end 
end 
7

Thread yılında ConditionVariable geçerli: gerçekten

require "thread" 

m = Mutex.new 
c = ConditionVariable.new 
t = [] 

t << Thread.new do 
    m.synchronize do 
    puts "A - I am in critical region" 
    c.wait(m) 
    puts "A - Back in critical region" 
    end 
end 

t << Thread.new do 
    m.synchronize do 
    puts "B - I am critical region now" 
    c.signal 
    puts "B - I am done with critical region" 
    end 
end 

t.each {|th| th.join }