我有一份在 Java 中需要很长时间的工作。所以我想把这个工作分成线程并运行它们。线程完成他们的工作后,返回到我的服务和服务给他们新的工作。ThreadGroup 适合这个或任何其他推荐?
5 回答
首先,如果有以下任一情况,您需要线程:
a) 你有一台多处理器机器
或 b)您有一个处理器,但您的工作是 IO 密集型(而不是 CPU 密集型)
否则,您在使用线程时将一无所获。
你这里需要的是ThreadPool
不确定您的项目目前处于何种开发状态,因为您的问题陈述非常有限,但您可能需要考虑查看 JDK7 中的 fork-join 项目:http: //www.ibm.com/ developerworks/java/library/j-jtp11137.html
从中可以学到很多东西,而且由于它都是开源的,您已经可以将代码作为补丁下载并尝试使用它。
(可能不适用于您现在必须实施的任何事情,但如果您打算在未来一段时间内开发/维护您的应用程序,那么值得一看)
查看ExecutorCompletionService - 它正是这样做的。
示例:[取自 Java 6 API JavaDocs]
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);
}
}
ThreadGroup
通常对应用程序代码没有多大用处。容器代码也没有多大用处。Java PlugIn 用于ThreadGroup
区分线程属于哪个applet。
java.util.concurrent
,特别是ExecutorService
提供了用于处理线程和并发的方便实用程序。
对于计算密集的细粒度任务,JDK7 中的 fork-join 框架将很有用。
在开始编写这个困难的代码之前,您可能需要考虑它是否值得。你能做其他不需要大规模线程使用的优化吗?您要处理的是 I/O 延迟吗?如果它是 CPU 密集型的,那么使用比硬件中更多的线程并没有多大意义。