web-dev-qa-db-ja.com

Java / Androidで別のスレッドが開始する前にスレッドが終了するのを待つ方法は?

私はこの非常に単純なコードを持っているとしましょう:

for(int i = 0; i < 10; i++) { 
    thread = new Thread(this); 
    thread.start(); 
} 

ただし、このコードでは、スレッドは明らかに一度に10回開始され、前のスレッドが終了するまで待機しません。スレッドを再び開始させる前に、スレッドが終了したかどうかをどのように確認しますか?

19
ZimZim

あなたの質問に答える前に、例えば ExecutorServices などの ThreadPoolExecutor を調べることを強くお勧めします。

質問に答えましょう:

前のスレッドが終了するのを待ち、次のスレッドを開始する前に、次の間にthread.join()を追加します。

for(int i = 0; i < 10; i++) { 
    thread = new Thread(this); 
    thread.start(); 

    thread.join();    // Wait for it to finish.
}

10個のスレッドを開始したい場合は、それらに作業を任せて、続けて、ループの後でそれらをjoinします:

Thread[] threads = new Thread[10];
for(int i = 0; i < threads.length; i++) { 
    threads[i] = new Thread(this); 
    threads[i].start(); 
}

// Wait for all of the threads to finish.
for (Thread thread : threads)
    thread.join();
32
aioobe

すべてのスレッドが開始する前に前のスレッドが終了するのを待たなければならない場合は、元のrunメソッドを順番に10回実行する1つの一意のスレッドが必要です。

Runnable r = new Runnable() {
    public void run() {
        for (int i = 0; i < 10; i++) {
            OuterClass.this.run();
        }
    }
}
new Thread(r).start();
11
JB Nizet

Aioobeの提案について詳しく説明します。

質問に答える前に、ThreadPoolExecutorなどのExecutorServicesを調べることを強くお勧めします。

このタスクに使用できる特定のExecutorServiceがあります。

_ExecutorService pool = Executors.newSingleThreadExecutor();
for (int i=0; i<10; i++) {
  pool.submit(this); //assuming this is a Runnable
}
pool.shutdown(); //no more tasks can be submitted, running tasks are not interrupted
_

newSingleThreadExecutor()newFixedThreadPool(1)の呼び出しに似ていますが、複数のスレッドを使用するようにサービスを再構成できないようにします。

2
crnv