Tôi muốn biết lựa chọn thay thế ruby của các phương pháp Java là gì:ruby chủ đề chương trình, ruby tương đương với java chờ đợi/thông báo/notifyAll
- chờ
- thông báo
- notifyAll
Bạn có thể đăng một đoạn mã nhỏ hoặc một số liên kết không?
Tôi muốn biết lựa chọn thay thế ruby của các phương pháp Java là gì:ruby chủ đề chương trình, ruby tương đương với java chờ đợi/thông báo/notifyAll
Bạn có thể đăng một đoạn mã nhỏ hoặc một số liên kết không?
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.
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'
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
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. –
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).
Tôi tin rằng ConditionVariable # broadcast tương đương với notifyAll() – finnw
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
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 }
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