, и в нем говорится, что использование этого .join должно ждать, пока один поток завершит sh, так что следующий запускается
Это не то, что делает join
.
join
блокирует текущий поток до тех пор, пока целевой поток не будет завершен. Он ничего не делает с другими потоками.
В вашем случае основной поток будет ждать от t1
до fini sh, затем до t2
и так далее. Но он ничего не делает для планирования работы t1
по отношению к t2
. В частности, он также не задерживает запуск t2
. t2
начинается, когда вы сказали t2.start()
.
Хорошо, как мне сказать остальным подождать?
В идеале вы используете конструкции более высокого уровня, такие как рабочие очереди и службы исполнителей вместо того, чтобы возиться с низкоуровневыми примитивами потоковой передачи.
Если вы действительно хотите продолжить это, посмотрите на ReentrantLock
или CountDownLatch
. Или используйте t1
, позвоните t2.join()
.
Я бы, вероятно, использовал CountDownLatch
. Настройте защелку так, чтобы потребовалось пять билетов, тогда каждый из ваших потоков может распечатать первую строку, затем заблокировать защелку, и только когда защелка отпустит (что происходит, когда все пять прибыли), они будут продолжать печатать вторую строку .
Также обратите внимание, что если вы хотите запускать эти задачи последовательно одну за другой, вам вообще не нужно несколько потоков. Просто введите t1.run(); t2.run(); t3.run();
в том же потоке.