首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >这是在非协程上下文中使用协程的权利吗

这是在非协程上下文中使用协程的权利吗
EN

Stack Overflow用户
提问于 2019-07-04 01:09:39
回答 1查看 89关注 0票数 0

有一个Processor类,试图用协程替换一些代码。因为它位于非协程上下文中,所以添加了val serviceScope = CoroutineScope(Dispatchers.IO + serviceJob)并将其用于启动协程。

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

在函数restart()中,它将CountDownLatch的使用替换为

代码语言:javascript
复制
serviceScope.launch {
                withContext(Dispatchers.IO) {

                    doReset()
                }
            }

问:这个launch/withContext实际上不会停止下一个if (!conDoProcess)的代码执行--所以它无法完成latch过去所做的事情。

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

另一个问题是,当处理这个调用serviceScope.cancel()Processor对象时,

如果使用serviceJob.cancel()调用,有什么不同

代码语言:javascript
复制
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()
            //==========>
        }
    }
}
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56875045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档