Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何一次调用两个参与者,即并行?_Java_Multithreading_Akka - Fatal编程技术网

Java 如何一次调用两个参与者,即并行?

Java 如何一次调用两个参与者,即并行?,java,multithreading,akka,Java,Multithreading,Akka,我有一个场景,两个功能并行运行 下面是示例伪代码 MainActor{ // retrive company ids //for each company id i need to run another two different actions simultaniously tell(A_Actor) tell(B_Actor) //if I call above they are calling sequentially i.e. first it runs tell(A

我有一个场景,两个功能并行运行

下面是示例伪代码

MainActor{
 // retrive company ids
 //for each company id i need to run another two different actions simultaniously 
   tell(A_Actor)
   tell(B_Actor)
//if I call above they are calling sequentially i.e. first it runs tell(A_Actor)
//then comes to tell(B_Actor).
//If tell(A_Actor) fails it wont run tell(B_Actor).
}
A_Actor{
// do ingest into a file.
}

B_Actor{
// do ingest into a DB.
}
问题:
如何运行两个功能,即tell(A_Actor)和tell(B_Actor)并行运行?

tell方法是异步的。当您向
actorA
发送
tell
时,它不会等到
actorA
完成或崩溃后才执行下一个操作,即
tell actorA

如果需要并行使用这两个
tell
方法,则可以执行以下操作:

    val tellActions = Vector(() => actorA.tell(messageA, senderActor), () => actorB.tell(messageB, senderActor))
    tellActions.par.foreach(_.apply())

请注意,这是Scala代码

这已经在一些评论(包括我的评论)中指出,但我觉得它值得回答

简而言之,您需要区分并行调用
tell
方法和参与者在并行执行的接收方法中执行的功能。该功能将自动并行执行,并行调用
tell
方法没有任何意义

显示的代码将在文件中执行摄取,并并行摄取到数据库中。这是自动的,不需要您采取任何行动;这就是actors和
tell
的工作原理。而且,不管您怎么说,如果文件摄取出现问题,它不会影响对数据库的摄取。(假设您正确构建了参与者和消息,因为您没有列出它们的实现。)


tell
方法是异步的:它几乎立即返回,并且不执行实际的逻辑(在本例中为接收):它所做的唯一事情是将邮件放在收件人的邮箱中。从理论上讲,伊斯梅尔的回答向您展示了如何并行地“调用
tell
”,但在该示例中,您“顺序地”创建了用于并行tell的数组,整个过程将非常低效。)他的代码在技术上按照您的要求执行,在实践中是毫无意义的:它除了显著降低代码的速度外,什么也做不到

简言之,我认为你:

  • 你的演员和你如何称呼他们有一些根本性的问题
  • 实际上,您正在并行执行功能,但您没有意识到这一点,因为您正在错误地测量/观察某些东西

  • 我不明白你的意思。tell方法是异步的。从文档:
    发送单向异步消息。例如,触发并忘记语义。
    Javascript不支持多线程…非常感谢。让我用java试试。我会告诉你的。是的,我觉得这个问题没有什么意义。正如您所指出的,tell()是异步的。它实际上并不起作用:它只是将一条消息添加到邮箱中。虽然您的示例可以工作,但它也毫无意义,因为tell()应该几乎是瞬时的。即使tell()被“顺序”调用,实际工作也将是并行的。