Java 如何检查所有演员完成后

Java 如何检查所有演员完成后,java,akka,actor,Java,Akka,Actor,我是阿克卡工具包的新手。我需要在多个文件上运行一个进程,这需要相当长的时间。因此,我为每个文件创建了一个参与者并开始处理。我在POJO类中创建这些演员,如下所示: public class ProcessFiles { private static final Logger logger = LoggerFactory.getLogger(ProcessFiles.class.getSimpleName()); public static void main(String[]

我是阿克卡工具包的新手。我需要在多个文件上运行一个进程,这需要相当长的时间。因此,我为每个文件创建了一个参与者并开始处理。我在POJO类中创建这些演员,如下所示:

public class ProcessFiles {
    private static final Logger logger = LoggerFactory.getLogger(ProcessFiles.class.getSimpleName());

    public static void main(String[] args) throws IOException, InterruptedException {
        long startTime = System.currentTimeMillis();

        logger.info("Creating actor system");
        ActorSystem system = ActorSystem.create("actor_system");

        Set<String> files = new HashSet<>();
        Stream<String> stringStream = Files.lines(Paths.get(fileName));
        stringStream.forEach(line -> files.addAll(Arrays.asList(line.split(","))));
        List<CompletableFuture<Object>> futureList = new ArrayList<>();

        files.forEach((String file) -> {
            ActorRef actorRef = system.actorOf(Props.create(ProcessFile.class, file));
            futureList.add(PatternsCS.ask(actorRef, file, DEFAULT_TIMEOUT).toCompletableFuture());
        });

        boolean isDone;
        do {
            Thread.sleep(30000);
            isDone = true;
            int count = 0;
            for (CompletableFuture<Object> future : futureList) {
                isDone = isDone & (future.isDone() || future.isCompletedExceptionally() || future.isCancelled());
                if (future.isDone() || future.isCompletedExceptionally() || future.isCancelled()) {
                    ++count;
                }
            }
            logger.info("Process is completed for " + count + " files out of " + files.size() + " files.");
        } while (!isDone);
        logger.info("Process is done in " + (System.currentTimeMillis() - startTime) + " ms");
        system.terminate();
    }
} 

这里,ProcessFile是actor类。在调用所有参与者以退出程序后,主进程每隔30秒检查所有参与者是否完成。有没有更好的方法来实现这种功能?

我建议再创建一个actor来跟踪系统中所有actor的终止,并在所有actor都被杀死时关闭actor系统。 所以在你的申请中-

处理文件后,ProcessFile actor可以向self发送毒药丸。 WatcherActor将watchcontext.watchprocessFileActor指定ProcessFileActor并维护已注册的所有ProcessFile Actor的计数

在actors终止时,WatcherActor将接收终止的消息。
它将减少计数,当计数达到0时,关闭ActorSystem。

PatternsCS.askactorRef,DEFAULT\u TIMEOUT中是否有输入错误?Akka 2.5中没有只使用两个参数的变体。@chunjef我纠正了错误。但是如果创建actor系统的主函数中的执行流在actor完成之前完成,进程本身不会结束吗?Java进程直到所有线程完成后才结束。