在非协程环境中使用协程是否有这种权利

时间:2019-07-03 17:09:38

标签: kotlin-coroutines withcontext

具有一个Processor类,试图用协程替换某些代码。由于它是在非协程环境中,因此添加了val serviceScope = CoroutineScope(Dispatchers.IO + serviceJob)并用于启动协程。

添加了CoroutineScope,并在使用Thread {}。start()的地方使用了serviceScope.launch{}

在函数restart()中,它用

代替了CountDownLatch的使用。
serviceScope.launch {
                withContext(Dispatchers.IO) {

                    doReset()
                }
            }

问题:这个launch / withContext实际上不会停止下一个if (!conDoProcess)的代码执行-因此它无法完成latch过去的工作。

doReset()之前停止代码执行的正确方法是什么。完成了吗?

另一个问题,当处置此Processor对象时,它称为serviceScope.cancel()

serviceJob.cancel()打电话有什么区别?

class Processor {

    private val serviceJob = Job()
    private val serviceScope = CoroutineScope(Dispatchers.IO + serviceJob)

            .........

    /* return false if the it does not start the processing */
    fun restart(): Boolean {

        synchronized(_lock) {

            .........

            // 1.old code using latch to wait

            /******************
            val latch = CountDownLatch(1)
            streamThreadPoolExecutor.execute {

                doReset()  //

                latch.countDown()
            }
            latch.await(3, TimeUnit.SECONDS) // wait at most for 3 seconds if no one calls countDown

            *******************/

            // 2. change to using coroutines to suspend

            serviceScope.launch {
                withContext(Dispatchers.IO) {

                    doReset()
                }
            }

            // wait until reset is done
            if (!conDoProcess) {// the doRest() should update conDoProcess
                return false
            }

            for (i in providers.indices) {
                val pr = provider[i]
                serviceScope.launch {
                    pr.doProcess()
                }
            }

            return true
        }
    }

    fun dispose() {
        synchronized(_lock) {

            .........
            serviceScope.cancel()

            // or should it use
            // serviceJob.cancel()
            //==========>
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我认为它使用了serviceScope.launch错误,它应该在阻塞部分withContext(Dispatchers.IO)之后但在serviceScope.launch内部包括其余部分。

        // 2. change to using coroutines to suspend

        serviceScope.launch {
            withContext(Dispatchers.IO) {

                doReset()
            }

            // wait until reset is done
            if (!conDoProcess) {// the doRest() should update conDoProcess
              return false
            }

            for (i in providers.indices) {
              val pr = provider[i]
              serviceScope.launch {
                  pr.doProcess()
              }
            }   
        }

        return true