我在学习Java中的线程时遇到了一些问题。我们的目标是进行模拟,向我们展示兔子在某种类型的棋盘上如何从狼身上跑出来。每只狼和每只兔子都应该成为一个线索。所以我在Test类的main方法中创建了一个GUI,并创建了一个实现Runnable接口的新类。我认为这很容易和合乎逻辑。但是现在,我如何从这些线程中调用AddRabbit
方法?因为非常线程应该像下面这样做:
答案 0 :(得分:5)
不允许直接使用多个线程更新Swing组件 - Swing不是线程安全的。它处理的是一个Swing事件队列,因此如果必须更新现有线程中的JComponent,则将使用以下代码:
//You are currently in a separate thread that's calculating your rabbit positions
SwingUtilities.invokeLater(new Runnable() {
public void run() {
//Put in code to modify your Swing elements
}
});
因此,每当您觉得需要更新GUI时,就可以使用SwingUtilities.invokeLater方法将Runnable实例传递到Swing事件队列,该方法将在自己的线程中处理。
答案 1 :(得分:4)
建议continuation的here是从多个线程更新GUI的不错选择,但可能很难正确地同步对共享数据的访问。
或者,使用javax.swing.Timer
定期更新管理狼和兔属性的模型。检查在网格上移动的对象的相关示例here。为了获得更大的灵活性,请使用图示为Model–View–Controller的here模式。