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前に送信された 10 個のスレッドすべての上に表示されているように、送信されたすべての試行を処理する必要がありますshutdownrunこれは、メソッド完了ログ/ステートメントを記録することで確認できます。runさらに、実際のコードを実行するときに、メソッドが各スレッドでどのくらいの時間を費やしているかとして、時間ログを追加できるかどうかを分析すると役立ちます。

于 2013-04-25T16:47:45.633 に答える