在有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].
有人有解决这个问题的想法吗?
谢谢您的时间。