受到 Akka 和 Quasar 等库的启发,我开始想知道这些库实际上是如何“在幕后”工作的。我知道这很可能非常复杂,并且它们的工作方式彼此完全不同。
我仍然想了解如何使用 Java 8 实现我自己的“事件驱动的轻量级线程”的(至多)非常基本的版本。
我对 Akka 作为一个库非常熟悉,并且对 JVM 上的并发性有一个中等的了解。
任何人都可以向我指出一些涵盖这一点的文献,或者尝试描述所涉及的概念吗?
在 Akka 中,它是这样工作的:
ActorRef.tell(msg)
时,msg
被放入被引用actor的邮箱中(虽然,这不足以运行任何东西)akka.actor.throughput
将由这一任务一次性处理。如果邮箱之后仍有消息,则调度程序会安排另一个任务来处理剩余的消息。之后任务退出。这确保了公平性,即运行此邮箱的线程不会被一个参与者无限期地阻塞。所以,基本上有两个工作队列:
高效编写此代码最难的部分是线程池。在线程池中,一堆工作线程需要以一种有效的方式访问它们的任务队列。默认情况下,Akka 在后台使用 JDK 的 ForkJoinPool,这是一个非常复杂的工作窃取线程池实现。
谁能给我指出一些关于这个的文献,
我是 Chronicle Queue 的架构师,您可以在我的博客https://vanilla-java.github.io/tag/Microservices/上阅读它的使用和工作方式
尝试描述所涉及的概念?
你有;
对于我工作的一些系统,您可以在 Java 中实现 30 微秒的延迟(网络数据包输入到网络数据包输出)
In Akka,
1.Actor system allocates the threads from thread pool to actors that have messages to process.
2.When the actor has no messages to process,thread is released and allocated to other actors that have messages to process
This way asynchronous actor systems can handle many more concurrent requests with the same amount of resources since the limited number of threads(thread pool) never sit idle while waiting for I/O operations to complete.
For more information you can download & check this e-book https://info.lightbend.com/COLL-20XX-Designing-Reactive-Systems_RES-LP.html?lst=BL&_ga=1.214533079.1169348714.1482593952