CompletableFuture runAsync 与使用 Executor 执行每个 Runnable

Căl*_*lin 4 java email multithreading asynchronous java-8

最近我试图实现一个电子邮件服务,同时向每个用户发送电子邮件。我当前的实现电流如下所示:

ExecutorService executor = Executors.newSingleThreadExecutor();
tasks.forEach(executor::execute); // Each task sends an email to an user
executorService.shutdown(); // Reclaim all the resources
Run Code Online (Sandbox Code Playgroud)

经过一番研究,我找到了一种新方法,即使用 Java 8CompletableFuture.runAsync(...)方法。使用这种方法我做了:

ExecutorService executor = Executors.newSingleThreadExecutor();
tasks.forEach(task -> CompletableFuture.runAsync(task, executor));
executor.shutdown(); // Reclaim all resources
Run Code Online (Sandbox Code Playgroud)

现在我有点困惑,就正确性、可扩展性而言,解决我的问题的最佳方法是什么,以及解决我的问题的最现代/当前的方法是什么。

Mạn*_*yễn 6

Executor.execute 将异步执行您的任务。

CompletableFuture.runAsync(Runnable, Executor)也异步执行您的任务,但另外,返回一个CompletableFuture对象,您可以使用它来链接/插入更多依赖任务。

(例如,发送电子邮件后,您要向自己发送通知以表示成功:

CompletableFuture.runAsync(task, executor).thenRunAsync(this::sendNotify) 
Run Code Online (Sandbox Code Playgroud)

对于您的用例,它没有什么不同。

为简单起见,您可以坚持使用第一个版本的代码。