Thead.join终止运行线程java(kotlin)
我有一个托管对象(Dropwizard),它正在处理内存队列。发送关机信号时,我需要处理队列的末尾。当我在不加入线程的情况下将shutdown信号设置为true时,我可以看到我是否在测试中设置了一个sleep来处理项目。然而,当我加入线程时,它似乎停止了线程死机,而不是等待run方法完成Thead.join终止运行线程java(kotlin),java,multithreading,kotlin,Java,Multithreading,Kotlin,我有一个托管对象(Dropwizard),它正在处理内存队列。发送关机信号时,我需要处理队列的末尾。当我在不加入线程的情况下将shutdown信号设置为true时,我可以看到我是否在测试中设置了一个sleep来处理项目。然而,当我加入线程时,它似乎停止了线程死机,而不是等待run方法完成 class LedgerProcessor constructor( private val ledgerProcessorQueue: LedgerProcessorQueue, priva
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] c.w.p.d.l.LedgerProcessor - Started
Processing ledger requests
INFO [12:02:44.738] [Thread-0] c.w.p.d.l.LedgerProcessor -
isShuttingDown: false, hasMore: true - true
INFO [12:02:44.739] [Thread-0] c.w.p.d.l.LedgerProcessor - Upserting
payment 61a20508-37e6-4347-a7d1-2538fda8c470 status: Processing
关闭Thread.join的测试日志:
INFO [12:04:41.994] [main] c.w.p.d.l.LedgerProcessor - Started Processing ledger requests
INFO [12:04:41.999] [Thread-0] c.w.p.d.l.LedgerProcessor - isShuttingDown: false, hasMore: true - true
INFO [12:04:41.999] [Thread-0] c.w.p.d.l.LedgerProcessor - Upserting payment 5de161b7-3158-4ee4-a5d7-a690b3b500d6 status: Processing
INFO [12:04:42.004] [Thread-0] c.w.p.d.l.LedgerProcessor - isShuttingDown: true, hasMore: true - true
INFO [12:04:42.004] [Thread-0] c.w.p.d.l.LedgerProcessor - Upserting payment 741ab5ee-48af-426c-b167-97641286e796 status: Processing
INFO [12:04:42.004] [Thread-0] c.w.p.d.l.LedgerProcessor - isShuttingDown: true, hasMore: true - true
INFO [12:04:42.004] [Thread-0] c.w.p.d.l.LedgerProcessor - Upserting payment 79546c86-5d02-4bd7-91b8-c2e0c5c4eb5f status: Processing
INFO [12:04:42.004] [Thread-0] c.w.p.d.l.LedgerProcessor - isShuttingDown: true, hasMore: false - false
join方法允许一个线程等待另一个线程的完成。如果t是线程当前正在执行的线程对象,则t.join();导致当前线程暂停执行,直到t的线程终止。取自:因此调用
pollingThread.join
将导致当前线程暂停执行,直到pollingThread完成。我的猜测是您的checkStatus有问题,但我想查看日志以查看记录了哪些get,哪些没有。@Nico我已将测试日志添加到问题中。谢谢