请告诉我如何最好地做到这一点:我有很多对象,大约 200 个,每 20 秒从网络更新一次它们的状态(类似于正在刷新的网页)。每个对象都有多个观察者/订阅者,一旦对象没有观察者,它就会停止更新,并且该对象不再存在。
我还没有想出为每个对象启动一个单独的线程、循环更新它并休眠 20 秒之类的方案。然后,当最后一个观察者退出时,更改标志中断并使用它来完成线程。
public class Controller implements Runnable {
...
public void run() {
log.info(Thread.currentThread().getName() + " start control: " + page.getUri().toString());
while (!Thread.currentThread().isInterrupted()) {
try {
notificationNewEvent(page.refreshEvents());
Thread.sleep(20000);
} catch (InterruptedException e) {
log.info("Thread is stop. ID:{}, Name: {}", page.getZip(), page.getTitle());
Thread.currentThread().interrupt();
}
}
}
}
您不需要循环
sleep()
。
您可以使用ScheduledExecutorService
。它可以像下面这样创建:
ScheduledExecutorService EXECUTOR
= Executors.newScheduledThreadPool(THREAD_POOL_SIZE);
一旦有了这个
EXECUTOR
,您就可以安排如下任务,假设您有execute()
方法:
EXECUTOR.scheduleAtFixedRate(
this::execute,
0, // initial delay
20, // interval
TimeUnit.SECONDS
);
那么,您想每 20 秒运行一次
notificationNewEvent(page.refreshEvents())
吗?您可以按照以下方式进行操作:
EXECUTOR.scheduleAtFixedRate(
() -> notificationNewEvent(page.refreshEvents()),
0, // initial delay
20, // interval
TimeUnit.SECONDS
);