我有一个在JBoss中运行的应用程序。我有一个传入的Web服务请求,它将更新ArrayList
。我想每隔60秒从另一个班级轮询这个列表。这样做最有效的方法是什么?
有人能指出一个很好的例子吗?
答案 0 :(得分:15)
我还建议ScheduledExecutorService,它提供了比Timer
和TimerTask
更高的灵活性,包括使用多个线程配置服务的能力。这意味着如果特定任务需要很长时间才能运行,则不会阻止其他任务开始。
// Create a service with 3 threads.
ScheduledExecutorService execService = Executors.newScheduledThreadPool(3);
// Schedule a task to run every 5 seconds with no initial delay.
execService.scheduleAtFixedRate(new Runnable() {
public void run() {
System.err.println("Hello, World");
}
}, 0L, 5L, TimeUnit.SECONDS);
答案 1 :(得分:9)
发布abyx时,Timer
和TimerTask
是以一定间隔运行类的轻量级解决方案。如果您需要重型调度程序,我可以建议Quartz。它是一个企业级作业调度程序。它可以轻松处理数千个预定的工作。就像我说的那样,这可能对你的情况有点过分了。
答案 2 :(得分:5)
您可以使用Timer
和TimerTask
。示例显示为here。
答案 3 :(得分:0)
请参阅java.util.Timer
。当你的应用出现并让它进行轮询时,你需要在一个单独的线程中启动一个机器人。
答案 4 :(得分:0)
检查问题"How to run a task daily from Java"的答案,以获取与您的问题相关的资源列表。
答案 5 :(得分:0)
其他答案基本上建议你做自己的线程。没有错,但它不符合EJB规范。如果这是一个问题,你可以使用JBoss的计时器工具。 Here是如何做到这一点的一个例子。
但是,如果EJB规范存在争议,那么像ArrayList这样的存储状态也不合规,所以如果你只是读取一些静态变量,特别是使用容器定时服务可能有点过分。