Пока числа извлекаются одно за другим, остальная часть метода не синхронизируется.Поэтому иногда это может происходить:
- t1: получает значение 0 от счетчика
- t2: получает значение 1 от счетчика
- t2: печатает w
- t1: печатает привет
Быстрое решение состоит в том, чтобы поместить всю строку System.out в блок synchronized
, но это не гарантирует, что потоки сменяются.Это просто гарантирует, что значение echt будет извлечено, увеличено и распечатано до следующего.
Если вы хотите, чтобы потоки действительно чередовались, вам придется реализовать некоторую блокировку.Но если вы не хотите, чтобы потоки ожидали друг друга, почему вы используете несколько потоков?
EDIT: также, вы, вероятно, должны иметь MyThread, реализующий Runnable вместо расширения Thread, если вы собираетесь использоватьэто так.См. Эту ссылку для получения дополнительной информации: https://www.baeldung.com/java-runnable-vs-extending-thread (Соломон Слоу избил меня до этого:)