我已经整合了一个简单的发布/订阅模式,以允许动态实例化和运行多个JavaFX类。这些类中的每一个(a'订户')用于可视化来自模型的数据(在模型/视图/控制器意义上),其具有“发布者”的角色。用于可视化的数据以不可变对象的形式出现,并且从模型(在其自己的线程中运行)传递到缓冲区' (也在另一个线程中运行)通过LinkedBlockingQueue。然后缓冲区通过将其放入LinkedBlockingQueues中重新发布模型中的所有数据,LinkedBlockingQueues由负责运行JavaFX可视化的线程清空。
因此,数据路径如下所示:
模型生成不可变对象----(LinkedBlockingQueue)---> Buffer使用对象并将它们放在多个队列上====(LinkedBlockingQueue)===>可视化线程使用对象,进行一些预处理,并使数据可用于时间轴动画,该动画定期更新图表。
程序的入口点扩展了Application,它的start()方法构建了所有JavaFX GUI组件,如下所示:
for (ModelVisualization viz : vizList) {
viz.buildGUI();
new Thread(viz).start();
}
您看到启动的线程是上述数据路径描述中数据的最终使用者。
问题:可视化显示和构建正确,但任何JavaFX窗口中的任何内容都不会更新,直到模型线程进入休眠状态。我可以使用System.err.println()
语句来验证模型中的数据是否正在通过各种线程移动而没有死锁,我可以看到可视化线程正在消耗所有内容。但是,除非模型线程命中Thread.sleep(100)
或类似,否则与时间轴关联的方法永远不会运行。
模型线程本身在入口点构造函数中启动,如下所示:
Thread simThread = new Thread(new Runnable() {
@Override
public void run() {
model.runSim();
}
});
simThread.setPriority(Thread.MIN_PRIORITY);
simThread.start();
......只有在那之后,JavaFX的东西开始于:
launch();
如果我理解正确的话,应该让模型线程独立于JavaFX运行。根据我的系统资源监视器,当程序运行时,我有四个未使用的核心(在OSX上使用Core i7),因此我看起来并不缺乏资源。
我不知道为什么我的模型线程运行时JavaFX会瘫痪。睡觉我的模特线程也是我想避免的。任何人都可以了解正在发生的事情,或者我如何让JavaFX正常运行?