Как дождаться окончания потока, прежде чем другой поток начнется в Java/Android?
Скажем, у меня есть этот очень простой код:
for(int i = 0; i < 10; i++) {
thread = new Thread(this);
thread.start();
}
Однако в этом коде поток, видимо, запускается 10 раз подряд, и он не ждет, пока предыдущий не будет завершен. Как вы проверяете, завершен ли поток, прежде чем разрешить запуск потока снова?
Ответы
Ответ 1
Прежде чем ответить на ваш вопрос, я настоятельно рекомендую вам изучить 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();
Ответ 2
Если каждый поток должен дождаться, пока предыдущий завершится до запуска, вам нужно будет иметь один уникальный поток, выполняющий первоначальный метод запуска 10 раз подряд:
Runnable r = new Runnable() {
public void run() {
for (int i = 0; i < 10; i++) {
OuterClass.this.run();
}
}
}
new Thread(r).start();
Ответ 3
Просто чтобы уточнить предложение 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)
, но гарантирует, что служба не может быть перенастроена для использования более чем одного потока.