2013-12-10 2 views
0

Часть приложения, которое я пишу, использует систему хронометров. Таймер должен указывать один раз каждые миллисекунды.Задача таймера Java работает медленнее, чем обычно.

В моем хронометре у меня есть эти переменные.

private static final int DELAY_IN_MILLISECONDS = 0; 
    private int intervalInMilliseconds = 1; 

Я запустить таймер, как это:

 timer = new Timer(); 
     timer.schedule(new Task(), DELAY_IN_MILLISECONDS, 
      getIntervalInMilliseconds()); 

Тем не менее, через секунду он достиг только около + - 100ms вместо того, чтобы 1000ms.

Хотя он работал нормально, пока я не добавил код в другую часть игры. Я уверен, что ничего не изменил по таймеру, но он стал медленнее, чем обычно (сначала он работал нормально).

Возможно ли, что мой таймер работает медленнее из-за применения, требующих слишком много процессорного времени для других вещей? (это игра, которую я создаю). Если да, то каким будет обычный способ решить эту проблему? Имея в виду, что игра важнее, чем таймер.

Заранее благодарен!

EDIT: Есть ли способ, чтобы выяснить, какая часть вашего приложения «узкие места» его, например, чек, где он использует большую часть ресурсов и т.д.?

+0

Вы _cannot_ отметьте каждый мс. 'Timer' использует' sleep' для ожидания - 'sleep' имеет разрешение около 15 мс в лучшем случае. Без ожидания и использования 'System.nanoTime()' вы не можете иметь более высокое разрешение, чем около 15 мс. –

+0

@BoristheSpider в порядке, что я смог проверить благодарность. Тем не менее, это было намного быстрее. Но тогда я предполагаю, что вся проблема заключается в пробуждении, которое на самом деле медленнее 15 мс. Я должен, вероятно, посмотреть на несколько потоков. EDIT: Кроме того, даже с этим 15мс, он должен принять его меньше, чем 10сек он использует теперь, я надеюсь, что:/ –

+0

Я не теперь внутренности 'Timer', но я думаю, что если бежит' Task' дольше, чем 1 мс, чем это задержит последующие «Задачи». – Katona

ответ

0

У меня на самом деле есть небольшое решение проблемы. Я перестал считать каждый мс, и просто сделал + = 15мс, чтобы встретить sleep();

Таймер теперь работает гладко и через минуту у меня было меньше 1second разницы с реальным временем это должно было быть.

Спасибо всем за вашу помощь, но любые другие (менее Времнные) решения по-прежнему очень приветствуются!

EDIT: Я только что получил этот метод из-за Бориса, так что вы можете оставить свой комментарий в качестве ответа, если вам нравится :)

1

Если долгосрочная точность планирования является то, что вы после этого, то вы должны использовать Метод Timer#scheduleAtFixedRate. Если вы постоянно перепланируете задачу с задержкой, то экземпляр Timer не может компенсировать свои прошлые ошибки времени.

Если кратковременная точность также является проблема, то вы должны перейти на Назначенный палаче службу, которая использует более точную технику низкого уровня для планирования задач.

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