私はこの非常に単純なコードを持っているとしましょう:
for(int i = 0; i < 10; i++) {
thread = new Thread(this);
thread.start();
}
ただし、このコードでは、スレッドは明らかに一度に10回開始され、前のスレッドが終了するまで待機しません。スレッドを再び開始させる前に、スレッドが終了したかどうかをどのように確認しますか?
あなたの質問に答える前に、例えば 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();
すべてのスレッドが開始する前に前のスレッドが終了するのを待たなければならない場合は、元のrunメソッドを順番に10回実行する1つの一意のスレッドが必要です。
Runnable r = new Runnable() {
public void run() {
for (int i = 0; i < 10; i++) {
OuterClass.this.run();
}
}
}
new Thread(r).start();
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)
の呼び出しに似ていますが、複数のスレッドを使用するようにサービスを再構成できないようにします。