2009-12-22 3 views
6

Как бы я начал и остановил отдельный поток из другого потока?Запуск и остановка Ruby Threads

loop_a_stopped = true 
loop_a = Thread.new do 
    loop do 
     Thread.stop if loop_a_stopped 

     # Do stuff 

     sleep 3 
    end 
end 

loop_b = Thread.new do 
    loop do 
     response = ask("> ") 
     case response.strip.downcase 
      when "start" 
       loop_a_stopped = false 
       loop_a.run 
      when "stop" 
       loop_a_stopped = true 
      when "exit" 
       break 
     end 
    end 
end 

loop_a.join 
loop_b.join 

ответ

8

Вот исправленный вариант вашего примера:

STDOUT.sync = true 

loop_a_stopped = true 

loop_a = Thread.new do 
    loop do 
     Thread.stop if loop_a_stopped 

     # Do stuff 

     sleep(1) 
    end 
end 

loop_b = Thread.new do 
    loop do 
     print "> " 
     response = gets 

     case response.strip.downcase 
     when "start" 
      loop_a_stopped = false 
      loop_a.wakeup 
     when "stop" 
      loop_a_stopped = true 
     when "exit" 
      # Terminate thread A regardless of state 
      loop_a.terminate! 
      # Terminate this thread 
      Thread.exit 
     end 
    end 
end 

loop_b.join 
loop_a.join 

управление потоками может быть немного сложнее. Остановка потока не завершает его, просто удаляет его из планировщика, поэтому вам действительно нужно убить его при завершении Thread #! прежде чем он будет действительно закончен.

+1

Ahh, это делает больше смысла, спасибо. Хотя, мне было интересно, что первое похоже: для STDOUT.sync = true. Я все выясню. – RyanScottLewis

+0

Хм, кажется, метод 'gets' останавливает loop_a от запуска. Что с этим? – RyanScottLewis

+0

С кодом выше не существует никаких проблем. Я могу запустить это без проблем. Я подозреваю, что вы сделали в loop_a (# Do stuff), возможно, остановите loop_a. – bryantsai

Смежные вопросы