请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

java为什么没有协程?协程和多线程的区别是什么?协程比多线程好?或者说协程为了解决什么问题?

java为什么没有协程?协程和多线程的区别是什么?协程比多线程好?或者说协程为了解决什么问题?

正在回答 回答被采纳积分+3

2回答

张勤一 2020-09-17 13:57:22

春去秋来你好:

    首先来说,Java 中为什么没有协程我不清楚,不过这个也确实是不重要。毕竟,你在面试、学习、工作的过程中,如果使用的是 Java 语言,协程这个概念几乎都是可以忽略的。那么,既然这里你问到了协程,我就简单来说下协程与线程。

    协程其实可以认为是比线程更小的执行单元。为啥说他是一个执行单元,因为他自带CPU上下文。这样只要在合适的时机,我们可以把一个协程切换到另一个协程。只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。

    协程可以理解为纯用户态的线程,其通过协作而不是抢占来进行切换。相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。总的来说,协程为协同任务提供了一种运行时抽象,这种抽象非常适合于协同多任务调度和数据流处理。在现代操作系统和编程语言中,因为用户态线程切换代价比内核态线程小,协程成为了一种轻量级的多任务模型。

    从编程角度上看,协程的思想本质上就是控制流的主动让出(yield)和恢复(resume)机制,迭代器常被用来实现协程,所以大部分的语言实现的协程中都有 yield 关键字,比如 Python、Lua。但也有特殊比如 Go 就使用的是通道来通信。我们看张图来理解下协程和线程的关系:

980882-20200426141416098-2126696932.png

    那么,线程和协程之间到底有什么不同呢?

    线程切换从系统层面远不止 保存和恢复 CPU上下文这么简单。操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。

    最后,协程对比线程有以下 3 个重要的优势:    

    (1)减少了线程切换的成本。线程,不管是创建还是切换,都需要较高的成本。子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。这也就是说,协程的效率比较高

    (2)协程的第二大优势就是没有并发问题,不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多

    (3)协程更轻量级。创建一个线程栈大概需要 1M 左右,而协程栈大概只需要几 K 或者几十 K


    我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!

2 回复 有任何疑惑可以回复我~
  • 980882-20200426141416098-2126696932.png  picture break
    tu pian  lie le,kan bu dao tu pian
    回复 有任何疑惑可以回复我~ 2021-04-03 23:28:11
  • fiber quasar ea-async Coroutine
    回复 有任何疑惑可以回复我~ 2021-04-03 23:35:29
提问者 春去_秋来 2020-09-17 14:19:08

既然协程比线程好,那java的多线程不是没啥用了,鸡肋了?

0 回复 有任何疑惑可以回复我~
  • 这个。。。。。。。。。。。。我不知道该如何回答。。。。。。。。。。。。。。。。
    回复 有任何疑惑可以回复我~ 2020-09-17 14:46:38
  • 提问者 春去_秋来 回复 张勤一 #2
    意思是不是说 学go更好 go比java更有优势
    回复 有任何疑惑可以回复我~ 2020-09-17 14:52:09
  • Jacquie 回复 提问者 春去_秋来 #3
    其实我发表个粗浅的看法哈,看一个语言是否好,不能单看某个点的执行效率,还要看生态,生态决定了你实际工作中能落地到什么程度。Java无疑是目前生态最丰富的语言,大量的公司在用,大量的人为了找工作在学,所以可以预见未来一段时间,Java仍有很大的竞争力。
    回复 有任何疑惑可以回复我~ 2020-09-22 16:45:52
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信