現在、以前のプログラムをマルチスレッド化しようとしています。以下にコードを示します。
public class DipoleTester {
public static String DIR = "/home/";
public static void main(String[] args) throws InterruptedException {
Dipole trial;
ExecutorService service =
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
for (int r = 10; r < 150; r += 1) {
double radius = (double) r / 10000.0;
for (int matType = 0; matType < 3; matType++) {
String name = matType + "_rad" + radius;
trial = new DipoleSimple(DIR, name);
trial.materialType = matType;
trial.RADIUS = radius;
service.submit(trial);
}
}
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS);
}
}
かなりわかりやすいプログラムです。run() は、以前は main() メソッドであった非常に基本的なメソッドです。評価には平均で約 3 分かかります。問題は、ここでは、スレッドプール全体を即座に評価するため、run() への非同期呼び出しを行っているように見えることです。
つまり、3 ~ 5 分で 8 つのスレッドを並行して実行することを期待しています。しかし、代わりに、それぞれを実行し、ほぼ瞬時に完了し、スレッドプール内の次のスレッドをロードします。そのため、すべて同時に実行しようとしている数百のスレッドが残っています。
何が起こっているのか分かりますか?