什么是结构化并发?
关键字:结构化并发、线程、Kotlin、协程
多线程的并发是全局的,⽽结构化并发中,每个并发都有⾃⼰作⽤域。
1. 线程的并发不是结构化的
可以想想这⼏个问题在 Java 中要怎么解决:
1. 结束⼀个线程时,怎么同时结束这个线程中创建的⼦线程?
2. 当某个⼦线程在执⾏时需要结束兄弟线程要做怎么做?
3. 如何等待所有⼦线程都执⾏完了再结束⽗线程?
这些问题都可以通过共享标记位、CountDownLatch 等⽅式实现。但这两个例⼦让我们意识到,线程间没有级联关系;所有线程执⾏的上下⽂都是整个进程,多个线程的并发是相对整个进程的,⽽不是相对某⼀个⽗线程。
这就是线程的「⾮结构化」。
2. 业务的并发是结构化的
通常,每个并发操作都是在处理⼀个任务单元,这个任务单元可能属于某个⽗任务单元,同时它也可能有⼦任务单元。⽽每个任务单元都有⾃⼰的⽣命周期,⼦任务的⽣命周期理应继了⽗任务的⽣命周期。
这就是业务的「结构化」。
3. 结构化的并发应该是什么样?
在结构化的并发中,每个并发操作都有⾃⼰的作⽤域,并且:
在⽗作⽤域内新建作⽤域都属于它的⼦作⽤域;
⽗作⽤域和⼦作⽤域具有级联关系;
kotlin多线程⽗作⽤域的⽣命周期持续到所有⼦作⽤域执⾏完;
当主动结束⽗作⽤域时,会级联结束它的各个⼦作⽤域。
例如 Kotlin 的协程就是 结构化的并发,它有 「协程作⽤域(CoroutineScope)」 的⾓⾊。全局的 Globa
lScope 是⼀个作⽤域,每个协程⾃⾝也是⼀个作⽤域。新建的协程对象和⽗协程保持着级联关系。
可以看出 协程的并发 和 业务的并发 更相似,它们都具有结构上的关联。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论