Ограничение вызовов методов до 1 в секунду с Java? - PullRequest
4 голосов
/ 30 декабря 2010

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

Лучшая идея, которую я могу придумать, это иметь pointcut для вызовов методов, которые я хочу ограничить, и иметь какую-то статическую переменную (сохраненную где?), Когда был последний вызов, и спать по мере необходимости. Это хорошая практика?

Спасибо!

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

Edit2: я пишу клиент для доступа к серверу. У меня нет никакого контроля над сервером.

Ответы [ 5 ]

4 голосов
/ 30 декабря 2010

Это довольно часто встречается в таких сценариях, как «обновление» и т. Д., Где желательно ограничить частоту.

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

2 голосов
/ 30 декабря 2010

Зачем ты это делаешь?Если бы мне нужно было найти какое-то странное решение, я бы сказал, что вы используете

System.currentTimeMillis() 

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

1 голос
/ 30 декабря 2010

Я бы сделал это, используя очередь команд, а затем планировщик с фиксированной скоростью, чтобы отправлять эти команды с необходимой скоростью. Вы могли бы даже встроить некоторую логику, чтобы обнаружить, могут ли новые команды, поступающие в очередь, объединяться с существующими неотправленными командами. Взгляните на java.util.concurrent.ScheduledExecutor и шаблон команды

0 голосов
/ 30 декабря 2010

Я не уверен, почему вы хотите этого. Вы пытаетесь сохранить память или процессор? Предполагая, что у вас есть веб-приложение с несколькими потоками, вы можете использовать что-то вроде java.util.concurrent.Semaphore, который является семафором для подсчета, чтобы ограничить число потоков, которые могут выполнить этот код, числом в семафоре http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html

Вы также можете использовать некоторые из планировщиков пула потоков, которые являются частью java.util.concurrent, чтобы создать определенное количество потоков в пуле потоков, а затем назначить им работу таким образом, чтобы вы могли ограничить частоту выполнения определенного фрагмента. код выполняется.

В java.util.concurrent есть и другие структуры данных, которые могут быть полезны, такие как BlockingQueue

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

0 голосов
/ 30 декабря 2010

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

...