我有停止協程執行緒的問題。我對協程沒有深入的了解,如果我在任何部分錯了,請糾正我,但我無法在任何地方找到解決方案。
我面臨的問題是,當我呼叫coroutineScope.cancel()它時,它不會停止下面的執行緒,協程正在停止并且它不會繼續運行,但下面的執行緒會移動到WAITING狀態。
我啟動協程的方式->
scope = CoroutineScope(
newFixedThreadPoolContext(
request.size,
"Sync Proxy connection threads dispatcher"
)
)
在啟動程序中,我將 Job 保存在 ConcurrentHashMap ->
request.forEach {
jobs[it] = (scope.launch {
runConnectorProcess(it)
})
}
然后基于一些邏輯我稱之為取消 - >
jobs[request]?.let {
it.cancel()
jobs.remove(syncRequest)
}
如果它是最后一個元素被取消 ->scope.cancel()
在除錯期間,我在 Thread Dump 中發現,該執行緒具有WAITING
來自 VisualVM 的日志狀態 ->
"Sync Proxy connection threads dispatcher" #168 daemon prio=5 os_prio=31 tid=0x00007fa78281b800 nid=0xd42f waiting on condition [0x000000030f563000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000077b305878> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2044)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
uj5u.com熱心網友回復:
你不應該期望取消 CoroutineScope 也會關閉它所參考的 CoroutineDispatcher,因為范圍不擁有調度程式。調度程式可以被多個范圍和單獨的協程使用。畢竟,它只是傳遞給 CoroutineScope 建構式的引數。如果你想關閉你的 CoroutineDispatcher,你需要將它存盤在它自己的屬性中,這樣你就可以close()在需要的時候呼叫它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/457393.html
