2

我目前正在尝试对我以前的程序进行多线程处理。下面是代码:

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 个线程。但是相反,它运行每个线程并说它几乎立即完成并加载线程池中的下一个线程。所以我剩下几百个线程都试图同时运行。

知道发生了什么吗?

4

1 回答 1

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此外,当您运行实际代码时,如果您可以添加时间日志作为每个线程所花费的时间方法,这将很有帮助。

于 2013-04-25T16:47:45.633 回答