从外面停止一个线程

时间:2011-12-02 12:25:32

标签: ruby multithreading

我有一个线程在后台做事情,我想在我的程序有真实的事情时暂停它。一旦完成,我希望后台线程继续。 E.g。

ta = Thread.new { loop { print 'a'; sleep 0.2 } }

sleep 0.5

# put ta to sleep
5.times { print 'b'; sleep 0.2 }
# let ta resume

sleep 0.8
puts

输出应该类似于aaabbbbbaaaaa。目前是aaabababababaaaaa

虽然一个线程可以通过Thread.stop自行停止,但是我找不到从“外部”停止线程的方法。有一个简单的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您需要的是Mutex

$my_mutex = Mutex.new

t1 = Thread.new do
  loop do
    $my_mutex.synchronize do
      print 'a'
    end
    sleep 0.2
  end
end

sleep 0.5

$my_mutex.synchronize do
  5.times do
    print 'b'
    sleep 0.2
  end
end

sleep 0.8

puts
sleep

输出:

aaabbbbbaaaaa
aaaaaaaaaaaaaaaaa...