Runnable run()函数立即终止

时间:2013-04-25 16:27:48

标签: java multithreading

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

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

知道发生了什么事吗?

1 个答案:

答案 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方法。