Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Thead.join终止运行线程java(kotlin)_Java_Multithreading_Kotlin - Fatal编程技术网

Thead.join终止运行线程java(kotlin)

Thead.join终止运行线程java(kotlin),java,multithreading,kotlin,Java,Multithreading,Kotlin,我有一个托管对象(Dropwizard),它正在处理内存队列。发送关机信号时,我需要处理队列的末尾。当我在不加入线程的情况下将shutdown信号设置为true时,我可以看到我是否在测试中设置了一个sleep来处理项目。然而,当我加入线程时,它似乎停止了线程死机,而不是等待run方法完成 class LedgerProcessor constructor( private val ledgerProcessorQueue: LedgerProcessorQueue, priva

我有一个托管对象(Dropwizard),它正在处理内存队列。发送关机信号时,我需要处理队列的末尾。当我在不加入线程的情况下将shutdown信号设置为true时,我可以看到我是否在测试中设置了一个sleep来处理项目。然而,当我加入线程时,它似乎停止了线程死机,而不是等待run方法完成

 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我已将测试日志添加到问题中。谢谢