英文:
How to run multiple methods parallely and get outputs from each of them in java
问题
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class test {
public static void main(String[] args) {
String total = "";
Callable<String> callable1 = new Callable<String>() {
@Override
public String call() throws Exception {
String t1 = "";
t1 = method1();
return t1;
}
};
Callable<String> callable2 = new Callable<String>() {
@Override
public String call() throws Exception {
String t2 = method2();
return t2;
}
};
Callable<String> callable3 = new Callable<String>() {
@Override
public String call() throws Exception {
String t3 = method3();
return t3;
}
};
List<Callable<String>> taskList = new ArrayList<Callable<String>>();
taskList.add(callable1);
taskList.add(callable2);
taskList.add(callable3);
ExecutorService executor = Executors.newFixedThreadPool(3);
try {
List<java.util.concurrent.Future<String>> futures = executor.invokeAll(taskList);
for (java.util.concurrent.Future<String> future : futures) {
total += future.get();
}
System.out.println(total);
} catch (InterruptedException ie) {
// do something if you care about interruption;
} catch (java.util.concurrent.ExecutionException ee) {
// handle exception if one of the tasks threw an exception
}
executor.shutdown();
}
public static String method1() {
System.out.println("method1");
return "1";
}
private static String method2() {
System.out.println("method2");
return "2";
}
private static String method3() {
System.out.println("method3");
return "3";
}
}
英文:
I want to run three different methods in parallel to improve the performance in Java. Also I need to get the outputs from all the three of them. Below is the sample which I have tried. here, I'm not sure how to retrieve the returned string values. Please help me to add(concatenate all the three strings to total).
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class test {
public static void main(String[] args) {
String total = "";
Callable<String> callable1 = new Callable<String>()
{
@Override
public String call() throws Exception
{
String t1 = "";
t1 = method1();
return t1;
}
};
Callable<String> callable2 = new Callable<String>()
{
@Override
public String call() throws Exception
{
String t2 = method2();
return t2;
}
};
Callable<String> callable3 = new Callable<String>()
{
@Override
public String call() throws Exception
{
String t3 = method3();
return t3;
}
};
List<Callable<String>> taskList = new ArrayList<Callable<String>>();
taskList.add(callable1);
taskList.add(callable2);
taskList.add(callable3);
ExecutorService executor = Executors.newFixedThreadPool(3);
try
{
executor.invokeAll(taskList);
//total = ;(want to concatenate all the strings here).
System.out.println(total);
}
catch (InterruptedException ie)
{
//do something if you care about interruption;
}
}
public static String method1()
{
System.out.println("method1");
return "1";
}
private static String method2()
{
System.out.println("method2");
return "2";
}
private static String method3()
{
System.out.println("method3");
return "3";
}
}
答案1
得分: 1
如taskList
是一个List<Callable<String>>
,executor.invokeAll(taskList)
会返回一个包含与taskList
中每个任务对应的Future<String>
的List<Future<String>>
。您需要保存该List<Future<String>>
,以便以后可以获取任务的结果。类似这样:
List<Future<String>> futureList = executor.invokeAll(tasklist);
String result = futureList.get(0).get() +
futureList.get(1).get() +
futureList.get(2).get();
除了InterruptedException
之外,Future.get()
还可能抛出CancellationException
和ExecutionException
,因此您需要在try
块中处理这些异常。
英文:
As taskList
is a List<Callable<String>>
, executor.invokeAll(taskList)
returns a List<Future<String>>
containing a Future<String>
corresponding to each task in taskList
. You need to save that List<Future<String>>
so that you can later get at the results of your tasks. Something like this:
List<Future<String>> futureList = executor.invokeAll(tasklist);
String result = futureList.get(0).get() +
futureList.get(1).get() +
futureList.get(2).get();
In addition to InterruptedException
, Future.get()
can also throw CancellationException
and ExecutionException
so you need to be prepared to deal with these in your try
block.
答案2
得分: 0
由于您只需要代码部分的翻译,以下是您提供的代码的中文翻译:
由于您的任务数量很少,您可以创建3个`CompletableFuture`,并在流中对其进行处理后合并。
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> method1());
CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> method2());
CompletableFuture<String> task3 = CompletableFuture.supplyAsync(() -> method3());
String concate = Stream.of(task1, task2, task3)
.map(CompletableFuture::join)
.reduce("", (s1, s2) -> s1 + s2);
System.out.println(concate);
英文:
As you have very few number of task, you can create 3 CompletableFutures
and stream over it and join it.
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> method1());
CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> method2());
CompletableFuture<String> task3 = CompletableFuture.supplyAsync(() -> method3());
String concate = Stream.of(task1, task2, task3)
.map(CompletableFuture::join)
.reduce("", (s1, s2) -> s1 + s2);
System.out.println(concate);
答案3
得分: 0
在 @Govinda 的回答基础上,您可以通过使用 supplyAsync
工厂方法创建一组 CompletableFuture
的 Stream
,然后通过调用 CompletableFuture::join
来完成它们,最后使用 Collectors.joining()
进行连接。
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(Test::method1);
CompletableFuture<String> task2 = CompletableFuture.supplyAsync(Test::method2);
CompletableFuture<String> task3 = CompletableFuture.supplyAsync(Test::method3);
String concat =
Stream.of(task1, task2, task3).map(CompletableFuture::join).collect(Collectors.joining());
System.out.println(concat);
英文:
Adding on top of @Govinda answer -
You can create Stream
of CompletableFuture
s by using the supplyAsync
factory method and complete them by calling CompletableFuture::join
and concat by calling Collectors.joining()
.
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(Test::method1);
CompletableFuture<String> task2 = CompletableFuture.supplyAsync(Test::method2);
CompletableFuture<String> task3 = CompletableFuture.supplyAsync(Test::method3);
String concat =
Stream.of(task1, task2, task3).map(CompletableFuture::join).collect(Collectors.joining());
System.out.println(concat);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论