— Привет, Амиго! Билаабо сегодня расскажет тебе о самом интересном методе при работе с нитями – это метод sleep. Метод sleep объявлен как статический метод класса Thread, т.е. он не привязан ни к какому объекту. Цель этого метода, чтобы программа «заснула» на некоторое время. Вот как это работает:
| Код | Описание |
|---|---|
|
Программа запустится. Затем замрет на 2 секунды (2 000 миллисекунд) Затем завершится. |
Единственный параметр метода sleep – это время. Время задается в тысячных долях секунды (миллисекундах). Как только нить вызывает этот метод, она засыпает на указанное количество миллисекунд.
— А где это лучше всего использовать?
— Этот метод часто используется в дочерних нитях, когда нужно делать какое-то действие постоянно, но не слишком часто. Смотри пример:
| Код | Описание |
|---|---|
|
Программа будет работать вечно – условие продолжения цикла никогда не нарушится. Вот что программа делает в цикле: Т.е. дважды в секунду будет выполняться некоторое действие. |
— Ух ты, теперь это уже интересно.
— Рад, что тебе понравилось, мой друг Амиго!
— А если я хочу, чтобы какое-то действие выполнялась 100 раз в секунду, что нужно делать?
— Если действие должно выполняться 100 раз в секунду, а в секунде 1000 миллисекунд, значит, действие должно выполняться один раз в 10 миллисекунд.
Если твое действие занимает 2 миллисекунды, то нужно добавить к нему паузу длинной 8 миллисекунд. Вместе они будут выполняться как раз за 10 миллисекунд. И за секунду – как раз 100 раз.
Если же твое действие выполняется почти мгновенно, то поставь паузу (sleep) длиной 10 миллисекунд. Тогда в секунду будет тоже около 100 раз.
— Спасибо, Билаабо.
doSomething()занимает в среднем 9,713 мс. Это значит, что за 1 секунду (1000 мс) действие успевает выполниться 102 раза: Итог: при времени выполнения ~9,713 мс действие укладывается в цель 100 раз в секунду: Тем не менее, запас времени крошечный — любое колебание может сделать sleepTime отрицательным. Существует три решения подобной проблемы: • ускорить само действие — задача оптимизации. Например, сократить число обращений к консоли: буферизовать вывод или собрать строки вStringBuilderи вывести их одним вызовом в конце, вместо 1000 отдельныхSystem.out.println; • вынести тяжёлую работу в отдельный поток — задача многопоточности. Например, тикер каждые 10 мс кладёт задачу в очередь и сразу продолжает, а отдельный поток-исполнитель разбирает очередь и выполняет вывод; • снизить требуемую частоту до реально достижимой — задача грамотного целеполагания. Например, вместо 100 раз в секунду поставить цель 50 раз в секунду (период 20 мс вместо 10 мс) — тогда время выполнения ~9,713 мс с хорошим запасом укладывается в период.