Как заставить поток ждать, пока не закончится дочерняя нить?

Я хочу перезапустить мой Main в цикле, пока пользователь не остановит его. Я создал новый класс также с методом main и вызываю main в цикле while(true). К сожалению, это не принесло желаемого эффекта. Потому что он не ждет, пока завершится другой основной, а просто перезапустится, пока мой оперативный компьютер не заполнится и программа не будет работать.

public class Main {

public static void main(String[] args) throws InterruptedException {
    boolean run=true;
    while(true) {
        Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                OldMain.main(args);

            }
        });

        t.start();
        t.join();
    }
}

Как я могу заставить цикл ждать окончания OldMain.main(args)?

1 ответ

Решение

Вы можете использовать CountDownLatch для ожидания основного метода, чтобы дождаться завершения всех остальных потоков. Вы можете настроить номер потока, требуемый числом в аргументе.

Пример:

public class Main {

    public static void main(final String[] args) throws InterruptedException {
        boolean run = true;
        CountDownLatch latch = new CountDownLatch(1);
        final MyClass myClass = new MyClass(latch);

        Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                myClass.doMyWork(args);
            }
        });

        t.start();
        latch.await();
        t.join();

    }

}

class MyClass {
    private CountDownLatch latch;

    public MyClass(CountDownLatch latch) {
        this.latch = latch;
    }

    public void doMyWork(String[] args) {
        for (int i = 0; i < 1000; i++) {
            System.out.println(i);
        }
        latch.countDown();
    }
}
Другие вопросы по тегам