Какой метод лучше? Позволить потоку поспать какое-то время или удалить его и создать заново позже? - PullRequest
6 голосов
/ 04 декабря 2008

У нас есть процесс, который должен запускаться каждые два часа. Это процесс, который должен выполняться в собственном потоке, чтобы не прерывать нормальную обработку.

Когда он запустится, он загрузит 100 тыс. Записей и проверит их по базе данных. Среда для выполнения этого имеет множество объектов, управляющих этим процессом. Эти объекты должны присутствовать только во время работы процесса.

Какой стандарт лучше?

  1. Держите поток в режиме ожидания, позволяя ему спать, пока он мне снова не понадобится. Или,

  2. Удалить, когда это будет сделано, и создать его в следующий раз, когда мне это понадобится? (События системного таймера.)

Ответы [ 13 ]

9 голосов
/ 04 декабря 2008

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

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

Если вы хотите остановить весь процесс, где ваш поток может выполняться или нет, вам нужно аккуратно прервать поток . Всегда трудно прервать поток или узнать, спит он или работает. У вас могут быть некоторые условия гонки. Запуск потока по требованию освобождает вас от этих потенциальных проблем: вы знаете, если вы запустили поток, и в этом случае вызов thread_join заставляет вас ждать, пока поток не будет завершен.

По этим причинам Я бы выбрал решение для потока по требованию , хотя у другого нет непреодолимых проблем.

4 голосов
/ 04 декабря 2008

Запуск одного потока каждые два часа очень дешев, поэтому я бы пошел с этим.

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

3 голосов
/ 04 декабря 2008

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

Просто позволь Нити спать ...

3 голосов
/ 04 декабря 2008

Либо должно быть в порядке, но я бы предпочел сохранить поток для случаев, когда проверка занимает больше времени, чем ожидалось (например: медленные сетевые ссылки или медленный ответ базы данных).

1 голос
/ 04 декабря 2008

Это действительно зависит от одной вещи, как я могу сказать ... состояние.

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

Однако, если состояние, которое создает процесс, является значительным по сравнению с объемом выполняемой работы, и у вас недостаточно ресурсов на машине, то это может не стоить затрат на поддержание состояния между периодами , Если это так, то вам следует каждый раз заново создавать поток с нуля.

1 голос
/ 04 декабря 2008

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

Но в любом случае это, вероятно, не очень большая разница, и разница, вероятно, будет зависеть от того, насколько хорош планировщик ОС и т. Д. *

1 голос
/ 04 декабря 2008

Если вы используете Java , вы можете проверить Таймер класс. Позволяет планировать задачи на заданное время.

Также, если вам нужно больше контроля, вы можете использовать кварцевую библиотеку.

1 голос
/ 04 декабря 2008

Я согласен с Вилксом, что это в основном дело вкуса. Обе технологии и служебная память занимают оба метода, но, вероятно, их недостаточно для того, чтобы они имели значение.

0 голосов
/ 04 декабря 2008

Все зависит, конечно. Но по умолчанию я бы пошел с отдельным процессом (не потоком), запущенным по требованию.

0 голосов
/ 04 декабря 2008

Еще одна важная вещь, которую следует учитывать, если вы работаете в системе сбора мусора, такой как Java, это то, что все, на что сильно ссылается спящий поток, не является мусором. В этом отношении лучше уничтожить пустые потоки и позволить им и любым объектам, на которые они ссылаются, очиститься.

...