用于java图形的multithreading

我有一个java应用程序,它可以传输原始数据并相应地绘制实时图。 这是通过调用我编写的使用Graphics对象的类的方法来处理的。 我在重写的paintComponent方法中实现了算法,以生成最新数据中的所有图。 我在我的类中有其他方法来更新paintComponent方法中使用的变量来绘制图形。

在我的主类中,我定期在计时器事件处理程序中更新我的图形。 在事件处理程序中,我从我的图形类中调用更新某些变量的方法,进行一些计算,然后调用repaint()(这显然是调用paintComponent方法的正确方法)。

我的问题是,我在paintComponent方法中使用的算法可能需要(相对)长的时间来完成,具体取决于我的图的数量和分辨率。 (我还没有遇到这个问题,但我现在正试图解决它)。 当然我不希望所有这些图形占用我的应用程序的所有处理时间,所以我想知道是否可以在单独的线程中执行“paintComponent”。

如果我在main中创建一个子类来运行一个单独的线程并简单地调用我描述的图形方法会发生什么? 会自动使所有这些方法(包括paintComponent)在新线程中执行吗? 或者我是否必须修改我的图表类本身才能使用? 理想情况下,我想避免修改我的图表类,因为我已经将它设计为在NetBeans GUI构建器中作为JPanel工作,我想避免破坏该function。

你必须将绘制方法重定向到SwingWorkerRunnable#Thread SwingWorker (所有输出到GUI必须包装到invokeLater ),例如这里或这里

有几种选择。

一种方法是使用两个BufferedImages,在另一个线程中绘制一个,并从另一个绘制,并在绘图完成时切换(我假设每隔一段时间就是一个快照。)

一个更好的解决方案是拥有一个可直接渲染的数据模型(就像它所持有的数据一样,无需对其进行任何进一步的算法工作)。

这意味着您将在单独的线程上执行alogirthms,计算将用于绘制的值,调用SwingUtilities.invokeLater来更新模型。 然后,模型将仅在Swing线程上更新,并且当您重新绘制时,您可以访问您需要绘制的数据(并且没有无关数据)。

如果这个数据仍然太多以至于绘画需要很长时间(例如:如果你正在绘制包含大量数据点的图表),你将发送以计算你的窗口的哪些部分需要重新绘制并激活重绘() 。 然而,这件作品应该是一个拉特胜地。 99%的性能将来自将算法移动到单独的线程中,并使画家可以访问直接可渲染的数据。

如果您查看使用外部数据更新TableModel的最佳实践,您所拥有的是在后台线程(通常是SwingWorker)中获取数据然后通过invokeLater()发布到实际模型的工作(这是数据当paint()尝试读取它时,不会被修改。)然后从模型更新中触发适当的事件,告诉表格哪些单元格发生了变化。 然后该表知道其视口的哪个部分需要重新绘制并触发相应的repaint()方法。 在此期间,后台线程可以继续检索数据并通过invokeLater向事件队列添加新更新。

好吧,如果你想提高GUI的响应能力,你可以在SwingWorker中完成冗长的工作,虽然我不知道这样做会不再加速你的应用程序。

我有一个java应用程序,它可以传输原始数据并相应地绘制实时图。 这是通过调用我编写的使用Graphics对象的类的方法来处理的。

要完成其他答案:您应该考虑使用JFreeChart 。 它是绘制图表的好库,您可以动态修改显示的数据集(并做更多的事情)。