事件派遣线程画

时间:2011-12-27 23:08:54

标签: multithreading swing java-2d

快一点 - 我正在编写Sega Master System模拟器。到目前为止的设计是GUI(JFrame子类等)在Event Dispatch Thread中运行,通过EventQueue.invokeLater()调用,并且所有模拟器函数在单独的线程中运行。根据我的理解,这应该是一个好习惯,因为EDT应该初始化和更新GUI,而Swing不是线程安全的。

这引出了一个小问题 - 控制台在单独的线程(Z80,VDP等)中运行,而VDP(当我完成它时)将更新BufferedImage。只要我将此BufferedImage标记为“synchronized”,然后从EDT(特别是GUI的绘制方法)访问它是否安全?我问这个,否则我将不得不将大量VDP逻辑放入paint方法本身,我宁愿不这样做,因为它会降低整体GUI的速度。

简单的问题我知道,但我仍然习惯于推动Java2D获得体面的速度动画。值得一提的是,在逻辑线程中调用repaint()方法之后,逻辑线程将一直睡眠,直到被唤醒进行下一帧传递,所以我猜测这个设计不会有性能损失 - 我我没错?

非常感谢, 菲尔波特

UPDATE 我应该使用更好的语言 - VDP将通过同步的setter方法访问BufferedImage,EDT将通过同步的getter方法访问它。

1 个答案:

答案 0 :(得分:2)

我认为你不需要让setter和getter同步,因为它们只能从EDT访问。让我们退一步吧。你说过将从EDT访问getter - 所以我们在这里是线程安全的。现在使用setter方法将在VDP上运行 - 为了处理这种情况,我们要调用invokeLater(参见示例)。请查看here以获取更多信息。

Runnable updateAComponent = new Runnable() {

    public void run() { 
//this will run in the EDT
component.doSomething(); 

}

};
//this will run in the VDP
SwingUtilities.invokeLater(updateAComponent);