gpt4 book ai didi

kotlin-coroutines - kotlin coroutines - 为什么 Thread.sleep 不会在启动时暂停主线程?

转载 作者:行者123 更新时间:2023-12-04 09:22:29 24 4
gpt4 key购买 nike

我想尝试从一个courtine 中暂停主线程。几个问题,但首先让我向您展示我正在使用的代码块作为测试:

class MainActivity : Activity(), CoroutineScope by MainScope() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

launch(Dispatchers.Main) {

val threadName = Thread.currentThread()
Log.v("mytag", "$threadName")
Log.v("mytag", "111 ")
Thread.sleep(5000)
Log.v("mytag", "222")

}

Thread.sleep(2500) //give coroutine some time to launch fully.
Log.v("mytag", "333")
}
}
产生以下输出:
V/mytag: 333
V/mytag: Thread[main,5,main]
V/mytag: 111
V/mytag: 222
因为我打印出当前线程名称不是主要的吗?我收到“线程 [main,5,main]”
所以假设我在主线程上,那么为什么当我运行 Thread.sleep(5000) 时会打印“333”?我期待“333”将是最后一次打印,因为我已经卡住了主线程。

最佳答案

调度员Dispatchers.Main调度协程在主线程被释放后立即运行。
它不会立即启动,因为您的 onCreate()也在主线程上运行,所以主线程不是空闲的 onCreate() ,主线程循环器将检查任何已调度的协程并在有时运行它。
如果您明确希望在调用启动后立即启动,并且如果您是线程的所有者(在本例中为 main)并且您是此处的所有者,因为您的函数 onCreate 在 main 上运行,您可以使用 Dispatchers.Main.immediate调度员在那里。

// immediate will launch immediately if current function is running on Dispatchers.Main which is true
launch(Dispatchers.Main.immediate) {
val threadName = Thread.currentThread()
Log.v("mytag", "$threadName")
Log.v("mytag", "111")
Thread.sleep(5000)
Log.v("mytag", "222")
}

Thread.sleep(2500)
Log.v("mytag", "333")
输出(日志):
V/mytag: Thread[main,5,main]
V/mytag: 111
V/mytag: 222
V/mytag: 333

关于kotlin-coroutines - kotlin coroutines - 为什么 Thread.sleep 不会在启动时暂停主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63076204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com