2009-08-19 33 views
0

我有一件工作在Java中花费的时间太长。所以我想把这个工作分解成线程并运行它们。线程完成他们的工作后,返回到我的服务和服务给他们新的工作。 ThreadGroup适用于这个或任何其他推荐?使用Java中的线程进行群集

+0

通过[从Java 6 API的JavaDoc拉] “给他们的工作:” 我想你的意思是你将数据传递给他们呢? “给他们新工作”涉及什么? – user142350 2009-08-19 14:58:43

+1

在这个经济体中,即使线程也很难找到工作。 。 。 – Gandalf 2009-08-20 17:27:55

回答

1

时退房ExecutorCompletionService - 它确实如此。

void solve(Executor e, Collection<Callable<Result>> solvers) 
    throws InterruptedException, ExecutionException { 
     CompletionService<Result> ecs 
      = new ExecutorCompletionService<Result>(e); 
     for (Callable<Result> s : solvers) 
      ecs.submit(s); 
     int n = solvers.size(); 
     for (int i = 0; i < n; ++i) { 
      Result r = ecs.take().get(); 
      if (r != null) 
       use(r); 
     } 
    } 
+0

你能给我一些样品吗? – firstthumb 2009-08-20 07:29:21

3

首先,你如果要么需要线程:

一)你有一个多处理器机器

或b)你有一个单一的处理器,但你的工作是IO密集型的(而不是CPU密集型)

否则,您在使用线程时将不会获​​得任何收益。

你所需要的就是ThreadPool

0

ThreadGroup通常对应用程序代码没有多大用处。这对容器代码也不是很有用。 Java PlugIn使用ThreadGroup来区分线程所属的小程序。

java.util.concurrent,尤其是ExecutorService,提供了用于处理线程和并发的便利实用程序。

对于计算密集型细粒度任务,JDK7中的fork-join框架将很有用。

在开始这个困难的代码之前,您可能需要考虑它是否值得。你可以做其他不需要大规模线程使用的优化吗?你正试图处理的是I/O延迟?如果它是CPU密集型的,那么在硬件上使用更多的线程并没有多少意义。

1

在什么样的发展状态项目目前,由于您的问题声明是相当有限的,但你可能要考虑让有看的fork-join项目在JDK7未来不确定:http://www.ibm.com/developerworks/java/library/j-jtp11137.html

有很多东西都可以从中看出来,因为它都是开源的,所以你可以下载代码作为补丁,并且可以继续使用它。

(可能并不适用于任何你必须实现现在,但值得一看非更少,如果你打算开发/维护您在未来的一段时间内应用)