2009-08-28 4 views
0

Ruby에 스레드가 있습니다. 그것은 루프를 실행합니다. 그 루프가 sleep (n)에 도달하면 멈추고 깨어나지 않습니다. sleep (n)을 사용하여 루프를 실행하면 무한 루프로 실행됩니다.Ruby 루프 스레드 실패

예상대로 스레드가 실행되지 않도록 코드에서 어떤 일이 발생합니까? 어떻게 수정합니까?

class NewObject 
    def initialize 
     @a_local_var = 'somaText' 
    end 

    def my_funk(a_word) 
     t = Thread.new(a_word) do |args| 
      until false do 
       puts a_word 
       puts @a_local_var 
       sleep 5 #This invokes the Fail 
      end 
     end 
    end 
end 

if __FILE__ == $0 
    s = NewObject.new() 
    s.my_funk('theWord') 
    d = gets 
end 

내 플랫폼은 윈도우 XP SP3
내가 설치 한 루비의 버전 당신은 가입이 누락 1.8.6

+0

위 코드는 "theWord"와 "somaText"를 5 초마다 인쇄합니다. 그게 당신이 기대하는 것입니까? 문제가있는 Ruby의 특정 버전은 무엇입니까? – molf

+0

이 코드를 ruby ​​1.8.6, 1.9.1 및 jruby 1.3.1과 함께 사용하여 예상대로 작동합니다. Thread.abort_on_exception = true를 추가하여 오류가 무엇인지 확인하십시오. – ottobar

답변

1

입니다.

class NewObject 
    def initialize 
    @a_local_var = 'somaText' 
    end 

    def my_funk(a_word) 
    t = Thread.new(a_word) do |args| 
     until false do 
     puts a_word 
     puts @a_local_var 
     sleep 5 
     end 
    end 
    t.join # allow this thread to finish before finishing main thread 
    end 
end 

if __FILE__ == $0 
    s = NewObject.new() 
    s.my_funk('theWord') 
    d = gets # now we never get here 
end 
+0

그래서 당신의 말은 my_funk가 끝나고 스레드 var가 존재하는 범위를 죽여서 실행을 멈출 수 있다는 것입니다. 왜냐하면 당신의 제안이 효과가 있기 때문입니다. – QueueHammer