2

別々のスレッドで2つ以上のメソッドを実行するメソッドが必要です。すべてのスレッドが完了する前にメソッドが終了しないことを確認したいと思います。

4

4 に答える 4

6

最善の方法は、制限のない数のスレッドを独自に開始するのではなく、Executor Service API を利用してスレッド プールを管理することです。

ExecutorService pool = Executors.newCachedThreadPool();
for (Runnable r : new Runnable[] {
    new R() { void r() { myMethod1(); }},
    new R() { void r() { myMethod2(); }},
})
  pool.execute(r);
pool.shutdown();
pool.awaitTermination(60, TimeUnit.SECONDS);

abstract class R implements Runnable
  public final void run() { r(); }
  abstract void r();
}

すべてのメソッドを独自の個別のスレッドで実行することを主張することはお勧めできないことに注意してください。スレッドは非常に重く (それぞれが完全なコール スタックを割り当てます)、スレッド数が使用可能なプロセッサ コアの数をはるかに超えて増加すると、実際にはパフォーマンスが低下します。

于 2012-11-06T10:58:34.237 に答える
2

私の解決策は

働き:

public void runParallel(Runnable... runnables) throws InterruptedException {

List<Thread> threads = new ArrayList<Thread>(runnables.length);

for (Runnable runnable :runnables) {
    Thread th = new Thread(runnable);
    threads.add(th);
    th.start();
}

for (Thread th : threads) {
    th.join();
}

使用する:

runParallel(new Runnable() {
                @Override
                public void run() {
                    method1()
                }
            }, new Runnable() {
                @Override
                public void run() {
                    method2()
                }
            }
);

より良いアイデアはありますか?多分私が気付いていないより短い方法があります;)

于 2012-11-06T10:53:06.440 に答える
2

私はこのようなものを好みます:

public static void runParallel(Runnable... runnables) throws InterruptedException {
    final CountDownLatch done = new CountDownLatch(runnables.length);
    for (final Runnable r: runnables) {
        new Thread(new Runnable() {
             public void run() {
                 try {
                     r.run();
                 } finally {
                     done.countDown();
                 }
             }
        }).start();
    }
   done.await();
}

このアプローチの利点は、スレッド プールでも機能することです (つまり、 に置き換えることができますnew Thread(...).start()) executor.submit(...)

awaitTermination()また、呼び出しごとに新しいプールを作成する必要があることに基づくソリューションとは異なり、既存のスレッド プールを使用することもできます。

于 2012-11-06T11:00:01.100 に答える
0

damienixによって提供された API に従います。

public void runParallel(Runnable... runnables) throws InterruptedException {
    final ExecutorService pool = Executors.newFixedThreadPool(runnables.length);
    for (Runnable runnable: runnables) {
        pool.submit(runnable);
    }
    pool.shutdown();
    pool.awaitTermination(1, TimeUnit.MINUTES);
}
于 2012-11-06T11:00:05.453 に答える