2014-01-27 6 views
-1

Я в настоящее время работает отдельную задачу в Java Swingworker, а вот код (отредактированный для ясности):Java пока цикл не выходя без Println

while (true) { 
    while (value == 0) { 
     value = utils.getValue(); 
     System.out.println("Value is zero"); 
    } 
    System.out.println("Value isn't zero, out of loop"); 
} 

Этот код работает прекрасно. Однако, если я удалю println («Значение равно нулю»), ничего не происходит, и цикл никогда не выходит. Другой поток обрабатывает популяцию значения, которое обновляется примерно через 5 секунд после запуска программы.

Я немного смущен, почему код выполняется только в том случае, если там есть println. Может ли кто-нибудь осветить этот свет?

+2

Вы никогда не «ломаетесь» из внешнего цикла. – Maroun

+2

Мы не можем ответить на этот вопрос, потому что мы не знаем, что делает 'getValue()'. Если 'value' всегда 0, вы не увидите никакого выхода, но он все равно будет работать. –

+0

getValue просто возвращает значение, сохраненное в другом объекте. Значение начинается с нуля, и после примерно 5 секунд обработки значение обновляется. – Tony

ответ

-1

Мое лучшее предположение: добавить некоторое состояние сна, чтобы дать другому потоку время для заполнения результата. В своем вопросе вы говорите, что это занимает около 5 секунд; это может занять (путь) дольше, когда вы добавите цикл «занято-ожидание» (в то время как true).

попробовать:

while (true) { 
    while (value == 0) { 
     value = utils.getValue(); 
     try { 
      Thread.sleep(500); 
     } 
     catch (InterruptedException e) { 
     } 
     System.out.println("Value is zero"); 
    } 
    System.out.println("Value isn't zero, out of loop"); 
} 
+0

Это исправлено! Кажется, что это было связано с разными нитями. Спасибо за решение! – Tony

+0

Вы также можете сделать занятый цикл ожидания занятым, но работая с помощью Thread.yield(); – LostBoy

+0

Спасибо LostBoy. Я отдам это. – Tony

4
  • Длинный ответ, читайте this.
  • Короткий ответ, значение, которое поток, хранящийся в куче, может быть кэширован другими потоками, и если вы не синхронизируете их, результат может быть неожиданным. Может быть, трудно понять, что происходит и почему. Доступ к общим переменным с синхронизацией или сохранение общих значений внутри объектов «atomic» или «volatile».
+0

Большое спасибо! Я думаю, мне нужно быть более осторожным с моими нитями. – Tony

Смежные вопросы