Для завершения работы нескольких потоков, запущенных из одного главного потока, можно использовать следующие методы:
1. Использовать флаги или переменные для контроля работы потоков. При завершении работы потоков установить соответствующие значения флагов, чтобы потоки завершили свою работу.
2. Использовать метод interrupt() для прерывания работы потоков. При завершении работы потоков вызвать метод interrupt() для каждого из них, чтобы прервать их выполнение.
3. Использовать метод join() для ожидания завершения работы потоков. При завершении работы потоков вызвать метод join() для каждого из них, чтобы дождаться их завершения.
Что касается использования метода join(), его нужно использовать в том случае, если необходимо дождаться завершения работы всех потоков перед продолжением работы главного потока. Если вы хотите, чтобы работа программы продолжалась после завершения потоков, то можно обойтись без использования join() и продолжить выполнение кода без ожидания завершения всех потоков.
В вашем случае, если время завершения потоков неизвестно и работа программы должна продолжаться, то можете оставить код без использования метода join(), чтобы не блокировать выполнение программы. При этом следите за корректным завершением потоков и освобождением ресурсов в соответствии с выбранным методом контроля работы потоков.