Timer & TimerTask против темы + спать в Java

Я нашел похожие вопросы, заданные здесь, но ответов на мое удовлетворение не было. Так перефразировав вопрос снова,

У меня есть задача, которая должна выполняться на периодической основе (скажем, 1-минутные интервалы). В чем преимущество использования Timertask & Timer для этого, а не для создания нового streamа, который имеет бесконечный цикл со сном?

Фрагмент кода с использованием timertask-

TimerTask uploadCheckerTimerTask = new TimerTask(){ public void run() { NewUploadServer.getInstance().checkAndUploadFiles(); } }; Timer uploadCheckerTimer = new Timer(true); uploadCheckerTimer.scheduleAtFixedRate(uploadCheckerTimerTask, 0, 60 * 1000); 

Фрагмент кода с использованием Thread и sleep-

 Thread t = new Thread(){ public void run() { while(true) { NewUploadServer.getInstance().checkAndUploadFiles(); Thread.sleep(60 * 1000); } } }; t.start(); 

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

Прокомментируйте это.

Благодаря,
-Keshav

Обновить:
Недавно я нашел другое отличие между использованием Timer и Thread.sleep (). Предположим, что текущее системное время составляет 11:00. Если мы откатимся от системного времени до 10:00 утра по какой-то причине, таймер выполнит выполнение задачи STOP до тех пор, пока не достигнет 11:00, тогда как метод Thread.sleep () будет продолжать выполнение задачи без помех. Это может быть одним из главных лиц, принимающих решения, при принятии решения о том, что использовать между этими двумя.

Преимущество TimerTask заключается в том, что он выражает ваше намерение намного лучше (т.е. читаемость кода), и у него уже есть функция cancel ().

Обратите внимание, что он может быть написан в более короткой форме, а также ваш собственный пример:

 Timer uploadCheckerTimer = new Timer(true); uploadCheckerTimer.scheduleAtFixedRate( new TimerTask() { public void run() { NewUploadServer.getInstance().checkAndUploadFiles(); } }, 0, 60 * 1000); 

Timer / TimerTask также учитывает время выполнения вашей задачи, поэтому он будет немного более точным. И он лучше справляется с проблемами многопоточности (например, избегая взаимоблокировок и т. Д.). И, конечно, обычно лучше использовать проверенный стандартный код вместо какого-либо домашнего решения.

Я не знаю, почему, но программа, которую я пишу, использует таймеры, и размер кучи постоянно увеличивается, как только я сменил его на проблему Thread / sleep.

Существует один важный аргумент против управления этой задачей с использованием streamов Java и метода sleep . Вы используете while(true) чтобы оставаться неопределенно в цикле и спящий stream, усыпляя. Что делать, если NewUploadServer.getInstance().checkAndUploadFiles(); берет некоторые синхронизированные ресурсы. Другие streamи не смогут получить доступ к этим ресурсам, может произойти голод, который может замедлить все ваше приложение. Такие ошибки трудно диагностировать, и это хорошая идея, чтобы предотвратить их существование.

Другой aproach запускает выполнение кода, который имеет для вас значение, то есть NewUploadServer.getInstance().checkAndUploadFiles(); вызывая метод run() вашего TimerTask , позволяя другим streamам использовать ресурсы в то же время.

Если вы используете исключение и убиваете, это проблема. Но TimerTask позаботится об этом. Он будет работать независимо от отказа в предыдущем запуске.

Думаю, я понимаю вашу проблему, я вижу нечто очень похожее. У меня есть таймеры, которые повторяются, каждые 30 минут и несколько раз в пару дней. Из того, что я прочитал, и комментариев, которые я вижу, похоже, что garbage collection никогда не будет запущен, потому что все задачи никогда не будут завершены. Я бы подумал, что garbage collection будет работать, когда таймер будет спать, но я не вижу его и, согласно документации, этого не делает.

Я думаю, что появление новых streamов завершается и позволяет собирать мусор.

Кто-то, пожалуйста, докажите мне, что неправильно, переписывать то, что я унаследовал, будет боль.

  • Как установить таймер в Java?
  • Завершить работу по истечении периода времени
  • System.Threading.Timer в C #, похоже, не работает. Он работает очень быстро каждые 3 секунды
  • Использование System.Windows.Forms.Timer.Start () / Stop () по сравнению с Enabled = true / false
  • Сравнение таймера с DispatcherTimer
  • Функция таймера для обеспечения времени в наносекундах с использованием C ++
  • java: запустить функцию через определенное количество секунд
  • java.util.Timer: устарел ли он?
  • Как запустить метод каждые X секунд
  • Остановить секундомер
  • Как измерить временной интервал в C?
  • Давайте будем гением компьютера.