当我阅读有关kotlin协程或golang协程中的并发性的文章时,人们总是给出相同的示例。
在Java或c#中创建100_000个线程,ooopps Stackoverflow.是的。但谁直接使用线程类在Java或c# ?
在java和c#中,有用于CompletableFuture和Task的线程池
当我们尝试创建100_000 Task或CompletableFuture时,我们可以很容易地使用ExecuterService/ForkJoinPool或dotnet DefaultThread Pool。他们将重用线程。如果没有可用的线程。任务将在队列中等待。
我的问题;
是的,结构化并发有利于取消。但是Kotlin使用了像CompletableFuture这样的线程池。但与Java回调不同的是,它提供了自然的代码语法。唯一的区别是语法的Kotlin协程之间的c#任务或Java CompletableFuture?
Kotlin运行在JVM上。据我所知,JVM不支持绿线程。但是人们说得好像kotlin使用Green Threads。这在JVM中怎么可能呢?为什么协程被称为轻量级线程。那么我们可以说CompletableFuture和Task也是轻量级线程。对吧?
是的,golang有一个调度器。运行例程是用户级线程。当我们创建一个gooutine时,它会进入localrunqueue。一个专用的操作系统线程从这个队列中一个接一个地获取程序并执行。没有上下文切换操作。它们都在同一个操作系统线程上运行,直到阻塞。了goroutine便宜,我们可以说是的了goroutine轻量级线程。
也许我对协程的理解完全错了。请纠正我。
让事情变得简单:
- 线程-易于使用,因为它是顺序的。从网络读取和写入文件就像:
writeToDisk(readFromNetwork())
一样简单。另一方面,在单独的线程中运行每个任务是昂贵的。 - Executors/CompletableFuture -性能更高,它可以更好地利用CPU和内存。另一方面,它需要使用回调,代码很快变得难以阅读和维护。
- 协同程序——顺序和高性能。
我忽略协程的其他特性,如结构化并发,因为这不是您主要关心的。