如何确保我的 class 中的线程在每次 rspec 测试后结束?

How can I make sure threads inside my class end after each rspec test?

我有一个 jruby class,它包含一个心跳,每隔特定秒数执行一次操作:(下面的简化代码)

class Client
  def initialise
    @interval = 30
    @heartbeat = Thread.new do
      begin
        loop do
          puts "heartbeat"
          sleep @interval
        end
      rescue Exception => e
        Thread.main.raise e
      end
    end
  end
end

我有一系列 rspec 实例化此 class 的测试。

在每次测试结束时,我希望对象被销毁,但线程似乎仍然存在。

目前我已经用以下方法解决了这个问题: client.rb:

def kill
    @heartbeat.kill
end

rspec:

after(:all) do
   client.kill
end

这似乎可以解决问题 - 但这并不是最好的方法。

解决这个问题的最佳方法是什么?

使用版本 jruby-9.1.10.0 & rspec 3.7.0

编辑: 根据 http://ruby-doc.org/core-2.4.0/Thread.html 我希望线程在主线程执行时正常终止 在我的测试中,我用

实例化了客户端
describe Client do
  context 'bla' do
    let(:client) do
      described_class.new
    end
    it 'blas' do
    end
  end
end

您应该将 after(:all) 替换为 after(:each)

应该是您想要执行的操作的正确语法,因为 after(:all) 在所有测试用例都已 运行 之后进行评估。