只是一个快速的-我正在编写一个世嘉主系统仿真器。到目前为止的设计是GUI (JFrame子类等)通过EventQueue.invokeLater()调用在事件调度线程中运行,所有模拟器函数都在一个单独的线程中运行。据我所知,这应该是一个很好的实践,因为EDT应该初始化和更新GUI,而Swing并不是线程安全的。
这就引出了一个小问题-控制台在单独的线程(Z80、VDP等)中运行。并且VDP (当我完成它)将更新一个BufferedImage。只要我将这个BufferedImage标记为“同步”,那么从EDT (特别是GUI的画图方法)访问它安全吗?我要求这样做,因为否则我将不得不将大量的VDP逻辑放入画图方法本身,而我不想这样做,因为这样会减缓GUI的整体速度。
简单的问题我知道,但我仍然习惯于推动Java2D的像样的速度动画。值得一提的是,在逻辑线程中调用了there ()方法之后,逻辑线程将一直休眠直到下一个帧传递被唤醒,所以我猜这个设计不会影响性能,对吗?
非常感谢,菲尔·波特
更新I应该使用更好的语言- VDP将通过同步设置器方法访问BufferedImage,而EDT将通过同步getter方法访问它。
发布于 2011-12-28 00:06:28
我不认为您需要使setter和getter同步,因为它们只应该从EDT访问。所以让我们退后一步。你说过将从EDT访问getter -所以我们在这里是线程安全的。现在,使用setter方法将在VDP上运行--为了处理这种情况,我们要调用invokeLater (参见示例)。查看这里获得更多信息。
Runnable updateAComponent = new Runnable() {
public void run() {
//this will run in the EDT
component.doSomething();
}
};
//this will run in the VDP
SwingUtilities.invokeLater(updateAComponent);https://stackoverflow.com/questions/8650195
复制相似问题