2016-04-25 2 views
0

Я хочу построить расширение TimerTask, которое работает в непрерывном цикле (то есть, как поддельные часы), но мне нужно, чтобы «время» было доступно для других методы.Создание фальшивых часов, чьи данные могут быть доступны из другого потока

Мне удалось синхронизировать часы, чтобы они работали нормально, и вернет «правильное» время на консоль из цикла синхронизации. Но всякий раз, когда я пытаюсь получить доступ к часам/дням/годам на поддельных часах по другому методу, он отпечатывает исходное значение инициализации 0 дней, 0 месяцев, 0 лет ... даже когда часы сами по себе идут дальше, как видно в режиме консоли, т.е. 5 дней, 6 месяцев, 9 лет.

My TimerTask увеличивается, как указано ниже (но за все часы, день, месяц, год): if (currenthour == 24) { currenthour = 0; currentday ++; } В конце цикла я помещаю поток в режим ожидания на 1000 мс, чтобы замедлить его.

Я подозреваю, что это связано с резьбовыми замками? Но, похоже, не может найти способ доказать/опровергнуть эту теорию или решить проблему. Любая помощь будет принята с благодарностью!

+2

Просьба указать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) – Vic

+0

Вы сделали поля 'volatile'? Переменные принимаются внутри локальных данных потока и только синхронизируются, когда поле является изменчивым. –

+0

Вам не нужно создавать поддельные копии только для чтения или даже делать поля 'volatile'. Однако сделайте, как сказал Joop, если вы хотите писать в этих полях. –

ответ

1

Я нашел ошибку, которая не имеет ничего общего с потоками. Я создал второй экземпляр объекта, который читался вместо этого.

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