программирование потока ruby, эквивалент ruby ​​java wait / notify / notifyAll - PullRequest
6 голосов
/ 11 февраля 2009

Я хотел бы знать, каковы альтернативы ruby ​​методам Java:

  • ожидание
  • уведомить
  • notifyAll

Не могли бы вы опубликовать небольшой фрагмент или несколько ссылок?

Ответы [ 5 ]

7 голосов
/ 24 июня 2010

То, что вы ищете, это ConditionVariable в 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 }
2 голосов
/ 11 февраля 2009

С учетом того, что я не знаю Java, основываясь на ваших комментариях, я думаю, что вам нужна переменная условия. Google для «переменной условия Ruby» предлагает множество полезных страниц. Первая ссылка , которую я получаю , кажется хорошим кратким введением в частности к условным переменным, в то время как эта выглядит так, как будто она дает более широкий охват многопоточного программирования на Ruby.

1 голос
/ 01 мая 2010

Я думаю, вы ищете что-то более похожее на это. Он будет работать с любым объектом, созданным после его выполнения. Это не идеально, особенно когда Thread.stop находится за пределами мьютекса. В Java, ожидая в потоке, освобождает монитор.

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
1 голос
/ 11 февраля 2009

Нет эквивалента notifyAll (), но два других - Thread.stop (останавливает текущий поток) и run (вызывается в остановленном потоке, чтобы он снова начал работать).

0 голосов
/ 11 февраля 2009

Я думаю, что вы хотите 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...