我正在尝试多线程处理我以前的程序。以下是代码:
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个线程。但相反,它运行每一个并说它立即完成,并加载线程池中的下一个线程。所以我留下了几百条线程,它们都试图同时运行。
知道发生了什么事吗?
答案 0 :(得分:0)
您的代码看起来很好,我尝试按照示例进行测试:
System.out.println("Available Processors: "+Runtime.getRuntime().availableProcessors());
ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
final AtomicInteger ai = new AtomicInteger();
for(int i=0; i<10; i++) {
es.submit(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName()+"_"+ai.incrementAndGet());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
System.out.println("shutting down");
es.shutdown();
System.out.println("shutdown");
es.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS);
System.out.println("Completed");
示例输出(考虑4个可用处理器):
Available Processors: 4
pool-1-thread-2_1
pool-1-thread-3_3
pool-1-thread-4_4
pool-1-thread-1_2
shutting down
shutdown
pool-1-thread-2_5
pool-1-thread-4_6
pool-1-thread-3_7
pool-1-thread-1_8
pool-1-thread-2_9
pool-1-thread-4_10
Completed
由于您未在shutdown
之后提交其他试用版,因此您必须先处理所有提交的试用版,因为您可以在shutdown
完成之前提交的所有10个主题中看到。您可以通过记录run
方法完成日志/语句来验证这一点。此外,分析是否可以添加时间日志,这有助于在运行实际代码时每个线程花费多少时间run
方法。