thead.join查杀正在运行的线程java(kotlin)

我有一个托管对象(Dropwizard),它正在处理内存中的队列。 关闭信号发送时,我需要处理队列的结束。 当我设置关闭信号为真,而不加入线程,我可以看到如果我把睡眠在我的测试项目处理。 但是,当我加入线程似乎停止线程死亡,而不是等待运行方法完成。

class LedgerProcessor constructor( private val ledgerProcessorQueue: LedgerProcessorQueue, private val paymentDao: PaymentDao) : Managed { private lateinit var pollingThread: Thread private val shuttingDown: AtomicBoolean = AtomicBoolean(false) override fun start() { log.info { "Started Processing ledger requests" } pollingThread = object : Thread() { override fun run() { while (checkStatus()) { val payment = ledgerProcessorQueue.next() log.info { "Upserting payment ${payment.tokenId} status: ${payment.status}" } paymentDao.upsert(payment) } } } pollingThread.start() } private fun checkStatus(): Boolean { val isShuttingDown = shuttingDown.get() val hasMore = ledgerProcessorQueue.hasNext() log.info { "isShuttingDown: $isShuttingDown, hasMore: $hasMore - ${!isShuttingDown || hasMore}" } return !isShuttingDown || hasMore } override fun stop() { shuttingDown.set(true) pollingThread.join() // this seems to stop the run in process } 

当pollingThread.join()存在时,此测试失败,但在没有加入时通过

  @Test fun whenStartedButStoppedBeforeAllProcessedThenAllPaymentsInQueueShouldBeProcessedBeforeEnd(){ val payment0 = aPayment() val payment1 = aPayment() val payment2 = aPayment() ledgerQueue.add(payment0) ledgerQueue.add(payment1) ledgerQueue.add(payment2) whenever(paymentDao.upsert(payment0)).then { ledgerProcessor.stop() } ledgerProcessor.start() //Thread.sleep(5000) verify(paymentDao).upsert(payment0) verify(paymentDao).upsert(payment1) verify(paymentDao).upsert(payment2) } 

测试日志与Thread.join:

 INFO [12:02:44.734] [main] cwpdlLedgerProcessor - Started Processing ledger requests INFO [12:02:44.738] [Thread-0] cwpdlLedgerProcessor - isShuttingDown: false, hasMore: true - true INFO [12:02:44.739] [Thread-0] cwpdlLedgerProcessor - Upserting payment 61a20508-37e6-4347-a7d1-2538fda8c470 status: Processing 

测试日志与Thread.join关闭:

 INFO [12:04:41.994] [main] cwpdlLedgerProcessor - Started Processing ledger requests INFO [12:04:41.999] [Thread-0] cwpdlLedgerProcessor - isShuttingDown: false, hasMore: true - true INFO [12:04:41.999] [Thread-0] cwpdlLedgerProcessor - Upserting payment 5de161b7-3158-4ee4-a5d7-a690b3b500d6 status: Processing INFO [12:04:42.004] [Thread-0] cwpdlLedgerProcessor - isShuttingDown: true, hasMore: true - true INFO [12:04:42.004] [Thread-0] cwpdlLedgerProcessor - Upserting payment 741ab5ee-48af-426c-b167-97641286e796 status: Processing INFO [12:04:42.004] [Thread-0] cwpdlLedgerProcessor - isShuttingDown: true, hasMore: true - true INFO [12:04:42.004] [Thread-0] cwpdlLedgerProcessor - Upserting payment 79546c86-5d02-4bd7-91b8-c2e0c5c4eb5f status: Processing INFO [12:04:42.004] [Thread-0] cwpdlLedgerProcessor - isShuttingDown: true, hasMore: false - false