Dav*_*ave 1 java multithreading scala jvm-hotspot
scala的actor模型如何利用C线程和本机系统线程?我知道编译器是可插入的,所以scala编译器取代了java编译器.我对下一步感到困惑,不是代码的中间表示只是被热点优化(可能不如基于线程的模型有效)并且转换为基于线程的机器代码和C的组合.
Vla*_*eev 11
关于Akka如何使用本机线程的非常粗略的图片如下.
Actor是由a实例化的对象ActorSystem Dispatcher.Dispatcher最终将执行委托给某些人ExecutorService.Dispatcher并ExecutorService确定JVM线程的创建和使用方式.默认情况下,使用基于fork-join池的执行程序服务.创建它的过程创建ForkJoinExecutorConfigurator了一个工厂,而工厂又创建了相应的实现ExecutorService.Thread在内部创建几个s并使用它们来执行给定的任务.实际的执行策略并不重要; 还有其他执行程序可以不同地跨线程调度任务,并且Akka可以配置为使用它们而不是默认的.Thread是一个JVM级抽象,在标准库中实现.它使用绑定到本机库(用一些本地语言编写,如C++或C),它将线程管理委托给操作系统.Thread创建并启动对象时,最终会创建并启动本机线程,并且此线程将执行提供给此Thread对象的代码.以下是演员如何执行的简单图表:
Actor -> Dispatcher -> ExecutorService ----> Thread --| |--> OS thread
|--> Thread --|native code boundary|--> OS thread
\--> Thread --| |--> OS thread
Run Code Online (Sandbox Code Playgroud)
你可以看到这里有几层抽象.最重要的一个是ExecutorService:它完全定义了线程实例化和这些线程上任务执行的实际策略.可以编写单线程执行程序服务(事实上,标准库中有一个),它永远不会产生额外的线程,并且可以强制Akka使用它.
actor的中间表示(我认为你的意思是Java字节代码)并没有直接优化到一个与本机线程一起工作的代码,因为它们是完全不同的抽象级别:actor是非常高级的并且提供了许多关于执行顺序的保证,同时线程非常低级,如果您希望程序正确,则必须小心使用.Akka确保正确使用线程,因此您不必自己考虑它.
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |