是否鼓励在 Java 中使用多处理池?我有这个Python代码,我正在转换为Java



Python 代码 - 使用多处理池并映射字符串数组。在数组中的每个项目上,使用分部函数调用callback_function:

p = multiprocessing.Pool(1)
p.map(functools.partial(callback_function,
arg1 = arg1,
arg2 = arg2,
), array_string_items)

我正在尝试在Java中做类似的事情。我在Java API中没有看到任何像上面的Python代码那样简单的内容。

1) 是否更鼓励使用线程而不是处理器池? 2)如果是这样,我将如何实施?

谢谢

你的Python示例在Java中看起来像这样:

stringList.parallelStream()
.map((str) -> callbackFunction.apply(arg1, arg2, str));

假设callbackFunction接受三个参数,并且你应用常量 arg1,arg2 参数使其部分化。

您可以显式定义分部函数:

int arg1 = 10;
String arg2 = "foo";
Function<String, String> partialFunction = (str) -> callbackFunction.apply(arg1, arg2, str);

然后流处理变得非常简单:

stringList.parallelStream().map(partialFunction);

Java8 流看起来几乎像你的示例:

Integer ageSum = persons
.parallelStream()
.reduce(0,
(sum, p) -> {
System.out.format("accumulator: sum=%s; person=%sn", sum, p);
return sum += p.age;
},
(sum1, sum2) -> {
System.out.format("combiner: sum1=%s; sum2=%sn", sum1, sum2);
return sum1 + sum2;
});

至于自定义可运行对象/可调用对象,解决方案对我来说似乎也像在 Python 中一样简单:

List<Callable<Void>> opsList = new ArrayList<>();
opsList.add(someCallable);
// create list of tasks you need to run in parallel...
ExecutorService execSvc = Executors.newFixedThreadPool(4); // 4 threads. check out newCachedThreadPool too
try {
execSvc.invokeAll(opsList);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
execSvc.shutdown();
}

相关内容

  • 没有找到相关文章

最新更新