Java 多线程和调度

问题描述 投票:0回答:1

请告诉我如何最好地做到这一点:我有很多对象,大约 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();
            }
        }
    }
}
java multithreading threadpool executorservice scheduledexecutorservice
1个回答
0
投票

您不需要循环

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
);

© www.soinside.com 2019 - 2024. All rights reserved.