Java 参与者与线程的定义不同?

Java 参与者与线程的定义不同?,java,multithreading,scala,akka,actor,Java,Multithreading,Scala,Akka,Actor,我试图理解演员和线程定义的区别。一些文章说参与者是轻量级线程,而其他文章则说参与者不是线程。我也知道一个线程可以运行多个参与者。我对如何准确区分演员和线程感到困惑。请帮我理解谢谢 我强烈建议首先阅读官方文件: 在幕后,Akka将在真实线程集上运行多个参与者集,通常多个参与者共享一个线程,一个参与者的后续调用可能最终在不同的线程上处理。Akka确保此实现细节不会影响处理参与者状态的单线程性 线程是一个“活动序列”——独立于特定对象。它可以执行属于任意对象的代码 而参与者是关于“拥有”自己的“活动

我试图理解演员和线程定义的区别。一些文章说参与者是轻量级线程,而其他文章则说参与者不是线程。我也知道一个线程可以运行多个参与者。我对如何准确区分演员和线程感到困惑。请帮我理解谢谢

我强烈建议首先阅读官方文件:

在幕后,Akka将在真实线程集上运行多个参与者集,通常多个参与者共享一个线程,一个参与者的后续调用可能最终在不同的线程上处理。Akka确保此实现细节不会影响处理参与者状态的单线程性

线程是一个“活动序列”——独立于特定对象。它可以执行属于任意对象的代码

而参与者是关于“拥有”自己的“活动序列”的特定对象的。但是请注意,这个演员序列不一定是一个线程。恰恰相反

从实现方面来看,可以使用一个线程驱动多个actor对象

与线程相比,参与者处于更高的抽象级别

Thread是一个JVM概念,而Actor是一个在JVM中运行的普通java类,因此问题不在于Actor vs Thread,而在于Actor如何使用线程

什么是演员?

在一个非常简单的层次上,参与者是一个实体,它一次接收一条消息,并对这些消息作出反应

演员如何使用线程?

当Actor收到消息时,它会执行一些动作作为响应。操作代码如何在JVM中运行?同样,如果简化情况,可以想象操作在当前线程上执行操作任务。此外,参与者可能决定在线程池上执行操作任务。只要参与者确保一次只处理一条消息,这其实并不重要。

我试图理解演员和线程定义的区别

老实说,他们之间真的没什么关系,所以很难谈论他们之间的差异。这就像谈论丰田凯美瑞和蓝色之间的区别

参与者是一个自包含、封装的实体,它纯粹通过发送消息与其他自包含、封装的实体进行通信

现在,如果这听起来和你对对象的定义完全一样,你是对的!参与者和对象之间有着深刻的联系:参与者计算模型由卡尔·休伊特提出,部分基于早期Smalltalk(Smalltalk-71、Smalltalk-72)的消息导向执行。艾伦·凯(Alan Kay)反过来引用了计划者的目标导向执行对Smalltalk的信息导向执行的重大影响……而计划者则是由卡尔·休伊特(Carl Hewitt)设计的。(PLANNER也是Prolog的前身,Prolog又是Erlang的前身;Erlang基于Prolog,最初是Prolog中的一个库,最初的实现是用Prolog编写的。)此外,卡尔·休伊特和艾伦·凯都引用了维特·瑟夫和鲍勃·卡恩早期关于后来成为互联网的工作作为灵感,他们都深受大自然的启发,卡尔·休伊特受到物理学的启发,艾伦·凯受到微生物学的启发。因此,这种深刻的联系和相似之处并不令人惊讶

演员和对象几乎是一样的。我们通常期望面向对象系统中的消息发送是同步的、即时的、可靠的和有序的,而对于参与者来说没有这样的保证。这就是参与者和对象之间的主要区别:参与者是消息可能丢失、重新排序、需要很长时间并且是异步的对象。(唯一的保证是消息最多只能传递一次。)此外,消息的接收者通常没有对发送者的隐式引用,因此如果接收者想要回复消息,发送者需要在传递消息的同时传递自己的引用(与典型的面向对象系统不同,在面向对象系统中,我总是可以
向发送者返回
某些内容)

一个演员可以做三件事,正是这三件事,仅此而已:

  • 创造新的演员
  • 将消息发送到它已经知道的参与者的地址(即它创建的参与者的地址,以及它在消息中发送的地址)
  • 指定如何处理下一条消息(这实质上是如何对可变状态建模)
  • 请注意,为了向参与者发送消息,您需要为参与者提供一个地址。您只能向地址发送消息。参与者可能有多个地址,并且多个参与者可能隐藏在一个地址后面。地址是不可伪造的,您不能自己构造一个地址,您必须将其交给您。(这与C中的指针和Java中的对象引用有很大区别。)

    在微软的Channel9社区网站上有一段很好的视频,内容是卡尔·休伊特(Carl Hewitt)本人和埃里克·梅杰(Erik Meijer)之间关于演员的白板会议(主要是)。该视频以可访问的方式解释了演员背后的基本思想以及演员的基本公理

    卡尔·休伊特还应邀在斯坦福大学的EE380计算机系统研讨会上发表演讲,他在会上谈到了,包括演员介绍

    线程,OTOH只是执行链。它们本质上只是一个指令指针和一个调用堆栈。特别是,线程没有(自己的)内存。一个进程的所有线程共享相同的内存。这意味着一个行为不正常的线程可能会使该进程的所有线程崩溃,并且对该共享内存的所有访问都必须