gpt4 book ai didi

java - 多线程环境下的任务拆分与处理

转载 作者:行者123 更新时间:2023-12-01 11:27:52 26 4
gpt4 key购买 nike

我有一个Java多线程的作业。我被困在一个点上。 有提交者接口(interface)为

public interface ProcessTask<T,U>
{
U processTasksFor(T arg);
}

有多个工作线程,主要任务ProcessTask是在线程中拆分成n个独立的任务部分。

在单独的taskProcessThread中处理每个拆分任务(对于每个部分单独的线程)并将结果返回到ProcessTask

我的ProcessTask总计并打印任务的所有结果,结果我们可以将其视为 int。

如何定义任务结构来模拟这个问题。任务可以划分在什么区域,用哪个并发类来模拟

最佳答案

可以有 2 个选项:

<强>1。使用java.util.concurrent.ExecutorService正如 Java 规范所述:

An Executor that provides methods to manage termination and methods that can produce a Future for tracking progress of one or more asynchronous tasks.

因此,使用 ExecutorService 的实现,您可以在给定数量的线程中异步或同步运行所有任务。为此,您需要创建一个 Callable 对象列表,并将其传递给 ExecutorService 对象的 invokeAll 方法。
invokeAll 方法将返回 Future 对象列表(每个 Future 对象将代表每个任务,并且顺序与您在 Callable 列表中输入的顺序相同)传递给 invokeAll 方法),您可以循环计算任务的所有结果并打印它。

您应该阅读 Executors 类的所有可用方法,这些方法返回 ExecutorService 的不同实例,因此选择适合您的方法。

通过这种方式,您将能够在 M 个线程中异步运行 N 个任务,一旦所有线程完成,您将获得 Future 对象列表,其中将为您提供每项任务的完成信息/状态。

 try {
List<Callable<Object>> callableList = new ArrayList<Callable<Object>>();
callableList.add(null); /*Add instance of Callable*/
callableList.add(null); /*Add instance of Callable*/
callableList.add(null); /*Add instance of Callable*/

//Specify how many threads you want or need to operate. Read other methods of Executors which return different instances of ExecutorService
final ExecutorService service = Executors.newFixedThreadPool(3);

//This will invoke all your N tasks in specified M threads ...
service.invokeAll(callableList);
} catch (InterruptedException e) {
e.printStackTrace();
}

<强>2。如果您在多处理器系统中运行应用程序(您应该是这样)并且想要利用所有可用的处理器,请使用 fork-join 框架。您需要阅读并完成一些示例才能理解这个框架,因为它有点棘手。

关于java - 多线程环境下的任务拆分与处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30667302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com