我正在尝试创建一个对象,它可以在自己的线程中顺序执行一些任务,就像它是一个队列一样。
以下示例仅用于演示我的设置,可能完全错误。
class CoroutinesTest {
fun a() {
GlobalScope.launch {
println("a started")
delay(1000)
println("a completed")
}
}
fun b() {
GlobalScope.launch {
println("b started")
delay(2000)
println("b completed")
}
}
fun complex() {
a()
b()
}
}
fun main() {
runBlocking {
val coroutinesTest = CoroutinesTest()
coroutinesTest.complex()
delay(10000)
}
}
Run Code Online (Sandbox Code Playgroud)
现在这段代码打印以下内容
a started
b started
a completed
b completed
Run Code Online (Sandbox Code Playgroud)
这意味着a和b并行执行。方法a,b和complex可以从不同的线程调用。当然,该complex方法也应该支持这个概念。现在,我需要一种机制,允许我一次只执行一个任务,这样我就可以获得以下输出:
a started
a completed
b started
b completed
Run Code Online (Sandbox Code Playgroud)
我做了一些研究,认为 …
我最近开始阅读有关协程的内容,我想询问某个场景。
考虑一个带有一个按钮的简单屏幕。单击后,它会执行一堆打印语句和一些延迟(其间)。到目前为止,我正在使用协程来实现这一目标。
现在,我的问题是,如果用户反复向该按钮发送垃圾邮件,是否有一种方法可以将任务排队并在专用线程上逐个执行(一旦前一个任务执行完毕)?
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
val thread = newSingleThreadContext("thread")
binding.button1.setOnClickListener {
CoroutineScope(thread).launch {
Log.d("ABC", " TEXT1 ")
delay(1000)
Log.d("ABC", " TEXT2 ")
delay(2000)
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我执行此操作,它会正常运行,并且如果我按一次按钮,我就可以看到日志:
TEXT1
TEXT2
Run Code Online (Sandbox Code Playgroud)
但是,如果我向按钮发送垃圾邮件,我会看到以下内容:
TEXT1
TEXT1
TEXT2
TEXT1
TEXT2
TEXT2
Run Code Online (Sandbox Code Playgroud)
基本上,根据我的观察,发生的情况是,当用户按下按钮时,协程就会在没有任何等待或检查的情况下执行。所以,我的问题是,如何编辑代码,以便当用户向按钮发送垃圾邮件时,每个 courotine 都会按顺序执行,并且每个 courotine 在下一个开始执行之前完成,以便输出如下所示:
TEXT1
TEXT2
TEXT1
TEXT2
TEXT1
TEXT2
Run Code Online (Sandbox Code Playgroud)