Подтвердить что ты не робот

Как дождаться окончания потока, прежде чем другой поток начнется в Java/Android?

Скажем, у меня есть этот очень простой код:

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

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

4b9b3361

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