【发布时间】:2019-09-02 23:50:39
【问题描述】:
我遇到如下情况:job1和job2同时访问服务器,返回状态为401,表示我的token访问已过期,需要刷新。我启动了返回新令牌的 job3。在这种情况下,我必须根据请求使用新令牌重新创建 job1 和 job2 并启动它们。
我有一个jobDispatcher,但它似乎对我没有帮助。这里是:
class JobDispatcher : CoroutineDispatcher() {
private val queue: Queue<Runnable> = LinkedList()
private var isPaused: Boolean = false
private var lastExecutedBlock: Runnable? = null
@Synchronized
override fun dispatch(context: CoroutineContext, block: Runnable) {
if (isPaused) {
queue.add(block)
} else {
thread {
lastExecutedBlock = block
block.run()
}
}
}
@Synchronized
fun pause() {
isPaused = true
if (lastExecutedBlock != null) {
queue.add(lastExecutedBlock)
lastExecutedBlock = null
}
}
@Synchronized
fun resume() {
isPaused = false
runQueue()
}
}
在job3启动之前调用pause方法,结果成功后调用resume方法。问题是 job1 和 job2 现在已经完成,现在我应该重新创建它们。是否有可能克隆作业并将其放入队列中?
我的问题是:解决这个问题的最佳解决方案是什么?在使用协程时,我有点迷茫。我的代码比我在这里描述的要复杂得多,我只需要一些针对这种情况的指导,如何管理它。协程之间如何通信?
欢迎任何想法。谢谢!
【问题讨论】: