使用Java限制方法每秒调用1次?

时间:2010-12-30 18:30:36

标签: java aspectj

我正在编写一个程序,我只希望用户能够每1秒进行一次方法调用。我无法找到在Java中执行此操作的最佳方法。

我能想到的最好的想法是为我想要限制的方法调用设置切入点,并在最后一次调用时使用某种静态变量(存储在哪里?),并根据需要进行休眠。这是好习惯吗?

谢谢!

编辑:方法调用正在访问繁忙的Web服务器,因此它们应限制为每秒1次。

Edit2:我正在编写一个访问服务器的客户端。我对服务器没有任何控制权。

5 个答案:

答案 0 :(得分:4)

这对于“刷新”等场景非常常见,因为在那里需要限制频率。

我会使用一个单独的工作线程。方法调用信号线程并立即返回。胎面醒来,检查自上次执行以来已经过了多长时间并在必要时运行。跟踪上次执行的长字段可以是线程的成员变量。

答案 1 :(得分:2)

你为什么要这样做?如果我不得不对这个古怪的东西给出某种解决方案,我会说你使用

System.currentTimeMillis() 

跟踪上次调用方法的时间,如果从现在开始到最后一次调用方法,则只返回一秒钟。

答案 2 :(得分:1)

我会通过使用命令队列然后使用固定速率调度程序以所需的速率发送这些命令来实现。您甚至可以构建一些逻辑来检测进入队列的新命令是否可以与现有的未分派命令合并。请查看java.util.concurrent.ScheduledExecutorcommand pattern

答案 3 :(得分:0)

我假设用户必须按一个按钮才能调用此方法。我会禁用该按钮,直到允许用户再次单击它。

答案 4 :(得分:0)

我不确定你为什么要这样做。你在尝试节省内存或CPU吗?假设您有一个包含多个线程的Web应用程序,您可以使用像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

如果您告诉我们更多有关您的应用程序的上下文,我们可以帮助您更好。