ファイルに対して実行するタスクのパイプラインがあり、さまざまな種類のタスクがそれぞれ異なるエグゼキューター サービス内で実行されます。各エグゼキューター サービスを初期化した後、最初のタスクを開始します。これは、すべてのファイルの処理が完了するまで終了しないことが保証されています。これは、フォルダーを処理することで、それ以上の作業が不要になるか、呼び出し可能なタスクが service2 に送信されるためです。そのため、最初のタスクで shutdown() 呼び出しが成功すると、すべてのファイルが task2 またはパイプラインのさらに下にある別のタスクで処理されます。最終的なサービスをシャットダウンできたら、完了です。
Loader loader = Loader.getInstanceOf();
List<ExecutorService> services = new ArrayList<ExecutorService>();
ExecutorService es = Executors.newSingleThreadExecutor();
//Init Services
services.add(es);
services.add(task1.getService());
services.add(task2.getService());
services.add(task3.getService());
services.add(task4.getService());
//Start Loading Files
es.submit(loader);
int count = 0;
for (ExecutorService service : services)
{
service.shutdown();
count++;
//Now wait for all submitted tasks to complete, for upto one day per task
service.awaitTermination(10, TimeUnit.DAYS);
MainWindow.logger.severe("Shutdown Task:" + count);
}
public class AnalyserService
{
protected String threadGroup;
public AnalyserService(String threadGroup)
{
this.threadGroup=threadGroup;
}
protected ExecutorService executorService;
protected CompletionService completionService;
protected void initExecutorService()
{
int workerSize = Runtime.getRuntime().availableProcessors();
executorService
= Executors.newFixedThreadPool(workerSize, new SongKongThreadFactory(threadGroup));
}
public ExecutorService getService()
{
if (executorService == null || executorService.isShutdown())
{
initExecutorService();
}
return executorService;
}
}
したがって、CPUロードロジックが正しくないことを除いて、これはすべて正常に機能しています。すべてのサービスは、コンピューターの CPU 数と同じプールを使用します。したがって、コンピューターに 4 つの CPU があり、5 つのサービスがある場合、20 のスレッドがすべて同時に動作しようとして、CPU が過負荷になる可能性があります。この場合、一度に 4 つのスレッドしか持つべきではないと思います。
各サービスが 1 つのスレッドを使用するように制限した場合、同時に実行されるスレッドは 5 つしかありませんが、これは正しくありません。
- より多くのサービスまたはより多くの CPU がある場合、もはや正しくありません
- ほとんどの作業のパイプライン キックは task1 によって行われるため、非効率的です。1 つの CPU に制限すると、必要以上に遅くなります。逆に、後でほとんどのスレッドが後のタスクによって実行され、 task1 には何もありません。する。
私が必要としているのは、すべてのタスクが 1 つのエグゼキューター サービスを共有し、そのプールサイズをコンピューターの CPU 数と同じに設定することだと思います。しかし、サービスがいつ終了したかをどのように特定するのでしょうか?
私はJava 7を使用しているので、現在Java 5の同時実行機能を使用しているだけで、役立つJava 7の新機能はありますか