互斥锁已被LOCKED锁定,但预期线程已锁定

时间:2018-08-02 07:56:40

标签: multithreading kotlin rx-java mutex

在有Java独立应用程序的地方,我遇到了这个关键问题。我需要从Web服务向Java应用程序请求一些参数,然后我的应用程序将相同的参数发送到我的智能仪表。将参数发送到智能电表后,我的应用程序需要等待直到结果出自智能电表。

对于独立应用程序,我使用 jersey 库。 jersey 库至少保留10个线程来处理Web服务。您看到我需要保留特定的线程以等待智能电表的结果。对于此特定问题,我创建了一个 MutexHolderCollection 来保存当前线程。

下面是MutexHolderCollection。

private val mutex = Mutex(true)
private val mutexHolders = mutableMapOf<String, Thread>()

fun blockThread(key: String, blockingThread: Thread) {
    if (!mutexHolders.contains(key)) {
        mutexHolders[key] = blockingThread
        runBlocking {
             mutex.withLock(blockingThread) { startTimer(blockingThread) }
        }
    }
    println("Mutex Complete")
}

private fun startTimer(blockingThread: Thread) {
       Observable.timer(1, TimeUnit.MINUTES)
              .subscribeOn(appRxSchedulers.network)
              .subscribe({
                   blockThread(blockingThread)
              }, Throwable::printStackTrace)
}

fun unlockThread(key: String) {
     if (mutexHolders.contains(key)) {
           val blockingThread = mutexHolders[key]
           mutex.unlock(blockingThread)
     }
}

private fun blockThread(blockingThread: Thread) = 
   mutex.unlock(blockingThread)

现在我可以成功锁定该线程,但是当我尝试解锁时,它给了我这个例外。

The Mutex is locked by LOCKED but expected Thread[Grizzly(8),5, main].

有人有解决这个问题的想法吗?

谢谢您的时间。

0 个答案:

没有答案