Класс Java Timer говорит: «Задачи таймера должны выполняться быстро», как мы можем определить быстро? - PullRequest
4 голосов
/ 05 декабря 2008

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

Ответы [ 7 ]

8 голосов
/ 05 декабря 2008

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

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

Я предполагаю, что вы говорите о java.util.Timer, а не о конкретных Swing?

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

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

Как правило, я избегаю использовать его для чего-либо серьезного, или я просто создаю новую тему.

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

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

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

java.util.concurrent.ScheduledThreadPoolExecutor является "новым java.util.Timer". У вас может быть несколько потоков (пулов), чтобы вы могли выполнять долго выполняющиеся задачи. Тем не менее, вы можете рассмотреть возможность проверки того, что вы не слишком много перекрываете.

И, конечно, вы можете иметь несколько Timer с и соответственно распределять свои TimerTask.

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

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

Если вам нужно проделать долгую работу, используйте таймер, чтобы «запустить» другой поток (добавить элемент в рабочую очередь или запустить второй поток в обработчике событий таймера). Это быстро освободит таймер для следующего события.

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

Таймер TASK должен выполняться быстро, интервал опроса не зависит от его использования. Убедитесь, что вы не путаете их.

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

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

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

Существуют лучшие решения для более сложного сценария в пакете java.util.concurrent, а также в других библиотеках, таких как Quartz.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...