多线程环境中的任务拆分和处理

时间:2015-06-05 13:04:56

标签: java multithreading

我有一个Java多线程的任务。我陷入了困境。   有提交者界面

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

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

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

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

如何定义任务结构以模拟此问题。在哪个区域可以划分任务,我应该使用哪个并发类来模拟

2 个答案:

答案 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 serviceFuture以确保您不会重新发明轮子。 另外,请查看ForkJoin framework