我有一个Java多线程的任务。我陷入了困境。 有提交者界面
public interface ProcessTask<T,U>
{
U processTasksFor(T arg);
}
有多个工作线程主要任务 ProcessTask 是在线程中分成n个独立的任务部分。
在单独的 taskProcessThread 中处理每个拆分的任务(对于每个部分单独的线程)并将结果返回到 ProcessTask 。
我的 ProcessTask 总计了任务的所有结果并将其打印出来, 结果我们可以将其视为int。
如何定义任务结构以模拟此问题。在哪个区域可以划分任务,我应该使用哪个并发类来模拟
答案 0 :(得分:1)
可以有两个选项:
<强> 1。使用java.util.concurrent.ExecutorService 正如Java规范所说:
Executor,提供管理终止和方法的方法 这可以产生一个跟踪一个或多个进度的Future 异步任务。
因此,使用ExecutorService
的实现,您可以在给定数量的线程中异步或同步地运行所有任务。为此,您需要创建Callable
个对象列表,并将其传递给invokeAll
对象的ExecutorService
方法。
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框架。你需要阅读并通过一些例子来理解这个框架,因为它有点棘手。
答案 1 :(得分:0)
我不确定我是否清楚地了解您的问题,但请看一下: Executors service和Future以确保您不会重新发明轮子。 另外,请查看ForkJoin framework。