Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Multithreading Akka:针对线程利用率的消息处理_Multithreading_Akka - Fatal编程技术网

Multithreading Akka:针对线程利用率的消息处理

Multithreading Akka:针对线程利用率的消息处理,multithreading,akka,Multithreading,Akka,当消息进入邮箱时,调度程序选择一个参与者,恢复它并将其放在操作系统线程上。Java线程与OS线程映射以执行 Actor将使用池中的一个线程,并使用该线程处理消息,然后将该线程释放到池中 演员没有专门的线程。有一个线程池,参与者将使用分配的线程来处理消息,消息处理完成后,线程将被释放。所以,Actor和线程是解耦的 现在让我们举一个例子: public class GreetingActor extends UntypedActor { LoggingAdapter log = Loggi

当消息进入邮箱时,调度程序选择一个参与者,恢复它并将其放在操作系统线程上。Java线程与OS线程映射以执行

Actor将使用池中的一个线程,并使用该线程处理消息,然后将该线程释放到池中

演员没有专门的线程。有一个线程池,参与者将使用分配的线程来处理消息,消息处理完成后,线程将被释放。所以,Actor和线程是解耦的

现在让我们举一个例子:

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

    public void onReceive(Object message) throws Exception {
        if (message instanceof String) {
            String sRmsg = (String) message;
            businessImpl.collectdata(sRmsg); // assume this method takes 1 mins for completion
        }
    }
}


ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
greeter.tell("Charlie Parker");
在这里,greeter-actor使用tell方法发送消息,所以该消息将进入邮箱队列,调度器将从队列中拾取消息,并使用该消息调用actor

当在GreetingActor的“onReceive”方法中收到消息时-我的问题是何时将actor线程释放回池中- 在onReceive方法中接收消息之后,还是在collectdata()方法执行之后

此外,“消息处理”表示什么

businessImpl.collectdata(sRmsg); // assume this method takes 1 mins for completion
如果这条线路可能需要那么长的时间,那么它应该是 被认为是阻塞呼叫。文档中有一节 这说明了如何安全地处理此类情况:

当在GreetingActor的“onReceive”方法中收到消息时-我的 问题是何时将参与者使用的线程释放回 水池- 在onReceive方法中接收消息后或在执行 collectdata()方法

它将在执行后将线程“释放”回池 长collectdata()调用——因此上面的代码是危险的

我在上面粘贴的链接有一些很好的模式如何处理 如果无法将任务拆分为更小的部分(例如 例如,因为您使用的是无法控制的外部库)

如果你能在短时间内把这个方法分解成更精细的粒度 由参与者处理的任务和消息传递,那么您就不需要 特殊处理

-Endre,

Akka团队

感谢您从邮件列表中添加我的答案,我不知道它也作为StackOverflow问题发布。