2014-07-23 55 views
1

我想创建主线程红宝石无限循环具有无限循环,同时具有在产生的线程无限循环,但这不起作用:创造主线程无限循环而产生的线程

my_threads = [] 
for i in 1..2 do 
    puts "Creating thread #{i}" 
    my_threads << Thread.new(i) do |j| 
     loop do 
      sleep(1) 
      puts "work in #{Thread.current.object_id}" 
     end 
    end 
end 

my_threads.each do |t| 
    t.join 
end 

loop do 
    sleep(1) 
    puts 'work in main thread' 
end 

我需要它,因为在我的Rails应用这种方式,我不能使用ActiveRecord对象线程内,如下解释:

https://stackoverflow.com/questions/24903230/activerecord-object-freezes-thread-in-multi-threaded-script

,所以我需要一个运行循环的主线程,同时具有催生线程运行他们的o wn同时循环。

但是上面的代码做到这一点:

work in 79515570work in 79515510 

work in 79515510work in 79515570 

work in 79515510work in 79515570 

work in 79515570work in 79515510 

work in 79515570work in 79515510 

work in 79515570 
work in 79515510 
work in 79515570 
work in 79515510 
work in 79515570work in 79515510 

它永远不会到达主线程循环。我怎样才能做到这一点?

回答

1

在你的主线程的代码停在这里:

my_threads.each do |t| 
    t.join 
end 

join做的是使当前线程等待,直到线程对象它被称为上完成它的运行。

要解决这个问题,简单地跳过上述块:

my_threads = [] 
for i in 1..2 do 
    puts "Creating thread #{i}" 
    my_threads << Thread.new(i) do |j| 
     loop do 
      sleep(1) 
      puts "work in #{Thread.current.object_id}" 
     end 
    end 
end 

loop do 
    sleep(1) 
    puts 'work in main thread' 
end 

# work in 84665270 
# work in 84665760 
# work in main thread 
# work in 84665270 
# work in 84665760 
# work in main thread 
# work in 84665270 
# work in 84665760 
# work in main thread 
# work in 84665270 
# work in 84665760 
+0

所以对主题的新调用自动开始在线程的工作? – JohnMerlino

+0

另外Thre​​ad :: abort_on_exception = true应该默认启用 – JohnMerlino

+0

@JohnMerlino - 是的,一旦线程初始化就会启动。 –