我一直在问最近一个项目的许多问题。这里是我所处的场景,任何帮助或正确的方向将有助于很多...EDT与主线程之间的通信
这是一个使用服务器和多个客户端构建的网络程序。每个客户端都有一个GUI,它必须根据服务器发送的命令行事。每个客户都被包装在名为Player
的类中。这个Player
有一个GUI(扩展JFrame
)和一个主要方法,并且服务器只有一个主要方法(没有GUI)。起初,这个类在主线程中创建这样的:
EventQueue.invokeLater(new Runnable()
{
public void run()
{
new Player().setVisible(true);
}
});
这是工作的罚款,直到我意识到整个Player
类在EDT现在正执行。因此,当我等待来自服务器的命令时,整个GUI将锁定,直到发送该命令并执行适当的操作。正如你可以想象的那样,这是一个可怕的设计,并且被证明是编码环境的一个真正的痛苦,当你每次想要检查某些东西时都必须找到一些疯狂的工作,这样GUI才能保持完好无损。
很显然,我必须在单独的线程中检查来自服务器的命令,并在EDT中运行GUI组件。我的第二个实现有两个类 - 一个用于GUI,另一个用于Player
。当时的想法是,该Player
有这样举行的GUI,这样我可以从Player
类访问GUI的变量,像这样:
class Player
{
public GUI gui;
...
// And then start this gui inside of the EDT.
EventQueue.invokeLater(new Runnable()
{
public void run()
{
this.gui = new GUI().setVisible(true);
}
}
这也不管用,新Runnable
this
因为里面对象是指Runnable
对象,而不是Player
。
如何在一个线程中的Player
类与EDT线程中相应的GUI类之间进行通信?