Как видно из предоставленных выходных данных, ваше приложение в основном работает нормально; это не «катится слишком часто»: он катится ровно так часто, как должен, а именно: пока игрок не выкинет либо 5 («точка» в этой игре), либо 7, что .. сделал; последнее, что он показывает, это рулон 4 + 1.
Фактическая «проблема» в том, что текст Player Win
печатается «слишком рано».
На самом деле происходит то, что System.out
и System.err
- разные потоки, и нет никакой гарантии, что они синхронизируются; если вы напечатаете 'a' в System.out
и сразу после 'b' в System.err
, нет гарантии, что 'a' всегда будет отображаться перед 'b' - хотя эти два потока внутренне согласованы; если вы напечатаете «a» в System.out
и сразу после этого «b» в System.out
, вы гарантированно будете всегда печатать в этом порядке.
Таким образом, исправить довольно просто: выберите один; либо используйте только System.err
, либо только System.out
.
В качестве альтернативы, синхронизируйте с блокировкой в любое время, когда вы печатаете, но это ... большие усилия для некоторых относительно продвинутых java.
NB: на подавляющем большинстве платформ System.out
и System.err
в конечном итоге синхронизируются или эффективно синхронизируются, вам понадобятся некоторые довольно конкретные c настройки, чтобы наблюдать за тем, что вы видите. Большинство людей не смогут воспроизвести это.