【问题标题】:How to run a fixed interval thread from start of app?如何从应用程序开始运行固定间隔线程?
【发布时间】:2014-11-26 17:56:59
【问题描述】:

这可能是一个措辞不当的标题,但我试图从一开始就收集有关我的应用程序的数据和统计信息。我正在使用 JavaFX,并且我有一个模型类将处理所有数据和处理。

我想要的是让该模型类从应用程序启动的那一刻开始收集数据(如运行时、线程数、内存使用情况......)。但我也希望它每秒不断更新这些值,这意味着我需要它在某种 ScheduledExecutorThread 或其他东西上运行。

我怎样才能做到这一点,从这个程序的一开始,模型类就会每秒运行一次“update()”函数?

【问题讨论】:

  • @G Boggs 看看this
  • @Chris 我不完全确定这是我想要做的。我希望班级从一开始就开始收集数据。首先,我该怎么做。其次,我不想调用一个函数,我希望它本质上自己启动线程。

标签: java multithreading javafx-2 periodic-task


【解决方案1】:

任何时候您希望在 Java 中进行固定间隔操作,您都应该研究 ScheduledExecutorService。在您的情况下,类似于:

private static final ScheduledExecutorService SERVICE = Executors.newScheduledThreadPool(1,
    new ThreadFactory() {
        public Thread newThread(Runnable r) {
            Thread t = new Thread("Tick Thread", r);
            t.setDaemon(true);
            return t;
        }
    });

private static final AtomicReference<Controller> CONTROLLER = new AtomicReference<>();

public static final void setController(Controller c) {
    CONTROLLER.compareAndSet(null, c);
}

static {

    Runnable task = new Runnable() {
        public void run() {
            //do something each second....
            // call the 'update()' method:
            Controller c = CONTROLLER.get();
            if (c != null) {
                c.update();
            }
        }
    }

    // delay 1 second, repeat each second.
    service.scheduleAtFixedRate(task, 1, 1, TimeUnit.SECONDS);
}

你可以把它放在类的静态初始化器中,你会在类加载的那一刻启动系统......你可能希望 ExecutorService 上的线程成为一个守护进程...所以你需要一个自定义线程工厂.....

上面的代码会立即启动,并且会更新Controller,如果有的话,每秒更新一次。

在你创建c控制器​​的那一刻,你可以使用静态方法设置值。

【讨论】:

  • 好吧,我就是这么想的。但我的问题是我有一个模型类,它是所有数据采集发生的地方。如果我希望这个类从程序启动的那一刻开始收集数据,我该怎么做?还有我怎样才能让 SeS 自己启动?
  • 让我更详细地更新一下......'update()' 方法是静态方法吗?
  • 它不是,它是模型希望可以访问的控制器类的一部分
  • 更新为静态且线程安全。当你有一个可用的时候调用 setController,ticker 就会把它捡起来走。
猜你喜欢
  • 2011-04-11
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多