Java で時間がかかりすぎる仕事があります。そこで、このジョブをスレッドに分割して実行したいと思います。スレッドがジョブを終了した後、私のサービスに戻り、サービスはスレッドに新しいジョブを与えます。ThreadGroup は、これまたはその他の推奨事項に適していますか?
5 に答える
まず、次のいずれかの場合にスレッドが必要です。
a) マルチプロセッサ マシンを使用している
または b) プロセッサは 1 つですが、ジョブは 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);
}
}
java.util.concurrentパッケージを見てください。
ここで知る必要があるすべてを見つける必要があるチュートリアルがあります。
http://java.sun.com/docs/books/tutorial/essential/concurrency/
特に高レベルの同時実行オブジェクトに注目してください。
ThreadGroup
通常、アプリケーション コードにはあまり役に立ちません。コンテナコードにもあまり役に立ちません。Java PlugIn はThreadGroup
、スレッドが属するアプレットを区別するために使用します。
java.util.concurrent
、特にExecutorService
は、スレッドと同時実行性を処理するための便利なユーティリティを提供します。
計算集約的なきめの細かいタスクの場合、JDK7 の fork-join フレームワークが役立ちます。
この難しいコードに着手する前に、それが価値があるかどうかを検討することをお勧めします。大規模なスレッドの使用を必要としない他の最適化を行うことはできますか? 対処しようとしているのは I/O レイテンシですか? CPU を集中的に使用する場合、ハードウェアで使用するよりも多くのスレッドを使用してもあまり意味がありません。