2009-02-11 30 views

Trả lời

2

Với báo trước rằng tôi không biết Java, dựa trên nhận xét của bạn, tôi nghĩ rằng bạn muốn có biến điều kiện. Google cho "biến điều kiện Ruby" đi kèm với một loạt các trang hữu ích. Các first link I get, có vẻ là một giới thiệu nhanh chóng tốt đẹp để điều kiện vars đặc biệt, trong khi this có vẻ như nó cung cấp cho một phạm vi rộng lớn hơn nhiều của lập trình luồng trong Ruby.

+0

Nó giống như Java, ngoại trừ ruby ​​sử dụng tín hiệu và java sử dụng thông báo. Cảm ơn ! – Geo

0

Tôi nghĩ rằng những gì bạn muốn là 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

Không thực sự. Tham gia chờ cho đến khi một luồng kết thúc thực hiện. Chờ tạm dừng một chuỗi cho đến khi nó được thông báo, để nó có thể tiếp tục thực hiện. – Geo

+0

Ah. Lỗi của tôi. Tôi không thực sự biết Java vì vậy đoán hoang dã của tôi đã thất bại. –

1

Không có tương đương với notifyAll(), nhưng hai người kia là Thread.stop (dừng thread hiện hành) và run (gọi tắt là trên một sợi dừng lại để làm cho nó bắt đầu đi một lần nữa).

+2

Tôi tin rằng ConditionVariable # broadcast tương đương với notifyAll() – finnw

1

Tôi nghĩ bạn đang tìm kiếm thứ gì đó giống như thế này. Nó sẽ hoạt động trên bất kỳ đối tượng nào được khởi tạo sau khi nó được thực thi. Nó không hoàn hảo, đặc biệt là khi Thread.stop nằm ngoài mutex. Trong java, chờ đợi trên một sợi, phát hành một màn hình.

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

gì bạn đang tìm kiếm là ConditionVariable trong Thread:

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 } 
Các vấn đề liên quan