2009-12-22 13 views
6

मैं एक और थ्रेड के भीतर से एक अलग थ्रेड कैसे शुरू करूं और रोकूं?रूबी थ्रेड को शुरू करना और रोकना

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 

थ्रेड प्रबंधन थोड़ा मुश्किल हो सकता है। थ्रेड को रोकना इसे समाप्त नहीं करता है, बस इसे शेड्यूलर से हटा देता है, इसलिए आपको वास्तव में इसे थ्रेड # समाप्त करने से मारना होगा! इससे पहले कि यह वास्तव में खत्म हो गया है।

+1

अहह, यह बहुत अधिक समझ में आता है, धन्यवाद। हालांकि, मैं सोच रहा था कि 'STDOUT.sync = true' जैसा पहला था। हालांकि मैं इसे समझ लेंगे। – RyanScottLewis

+0

एचएम, ऐसा लगता है कि 'होट' विधि loop_a को चलने से रोकती है। इसके साथ क्या हुआ? – RyanScottLewis

+0

उपरोक्त कोड के साथ कोई समस्या नहीं है। मैं इसे बिना किसी समस्या के चला सकता हूं। मुझे संदेह है कि आपने loop_a (# Do stuff) में क्या किया था loop_a को रोक सकता है। – bryantsai

संबंधित मुद्दे