Как ждать завершения потока, прежде чем другой поток запустится в Java / Android? - PullRequest
19 голосов
/ 27 ноября 2011

Допустим, у меня есть очень простой код:

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

Однако в этом коде поток, по-видимому, запускается 10 раз за раз, и он не ждет, пока предыдущий не завершится.Как проверить, завершен ли поток, прежде чем снова разрешить запуск потока?

Ответы [ 3 ]

32 голосов
/ 27 ноября 2011

Прежде чем ответить на ваш вопрос, я настоятельно рекомендую вам посмотреть 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();
11 голосов
/ 27 ноября 2011

Если каждый поток должен дождаться завершения предыдущего перед запуском, вам лучше иметь один уникальный поток, выполняющий оригинальный метод запуска 10 раз в последовательности:

Runnable r = new Runnable() {
    public void run() {
        for (int i = 0; i < 10; i++) {
            OuterClass.this.run();
        }
    }
}
new Thread(r).start();
2 голосов
/ 11 июля 2014

Просто чтобы уточнить предложение aioobe:

Прежде чем ответить на ваш вопрос, я настоятельно рекомендую вам изучить ExecutorServices, такие как, например, ThreadPoolExecutor.

Для этой задачи можно использовать определенный 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), но гарантирует, что служба не может быть перенастроена для использования более чем одного потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...