如何从Java中的一个线程和另一个线程中获取数据?

如何从Java中的一个线程和另一个线程中获取数据?,java,multithreading,Java,Multithreading,我有一个简单的客户机-服务器程序。在一个线程中,GUI正在运行,当我在GUI上单击“连接”按钮时,我在新线程中连接到服务器,一段时间后,我从服务器接收到一些数据,我想将其传递到GUI-我该如何做?通常,通过将回调对象传递到新线程,并且每当有结果时,调用该回调,这反过来又会更新GUI “回调”可以是实现自定义接口的对象,该接口将结果作为参数 BackgroundThread background = new BackgroundThread(); backgroundThread.setCallb

我有一个简单的客户机-服务器程序。在一个线程中,GUI正在运行,当我在GUI上单击“连接”按钮时,我在新线程中连接到服务器,一段时间后,我从服务器接收到一些数据,我想将其传递到GUI-我该如何做?通常,通过将回调对象传递到新线程,并且每当有结果时,调用该回调,这反过来又会更新GUI

“回调”可以是实现自定义接口的对象,该接口将结果作为参数

BackgroundThread background = new BackgroundThread();
backgroundThread.setCallback(new Foo() {
   public void updateGUI(Bar bar) {
        //...
   }
}
然后,当您在后台线程中获得可用信息时,您可以调用:

getCallback().updateGUI(bar);

通常-通过将回调对象传递给新线程,并在有结果时调用该回调,从而更新GUI

“回调”可以是实现自定义接口的对象,该接口将结果作为参数

BackgroundThread background = new BackgroundThread();
backgroundThread.setCallback(new Foo() {
   public void updateGUI(Bar bar) {
        //...
   }
}
然后,当您在后台线程中获得可用信息时,您可以调用:

getCallback().updateGUI(bar);

将对GUI对象的引用传递给读取线程,并让读取线程在收到数据时调用GUI实例的方法

如果GUI是Swing GUI,则需要将调用包装到
SwingUtilities.invokeLater()

在阅读线程中:

String data = readData();
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        gui.dataHasBeenReceived(data);
    }
});

注意,它是专门为这种用例设计的

将对GUI对象的引用传递给读取线程,并让读取线程在收到数据时调用GUI实例的方法

如果GUI是Swing GUI,则需要将调用包装到
SwingUtilities.invokeLater()

在阅读线程中:

String data = readData();
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        gui.dataHasBeenReceived(data);
    }
});

注意,它是专门为这种用例设计的

感谢您的解释和示例代码,它们在我的简单程序中运行得非常好。我听说过SwingWorker,但我不想为了把一个短字符串从一个线程发送到另一个线程而阅读和学习整个课程。感谢您的解释和示例代码,它们在我的简单程序中非常有效。我听说过SwingWorker,但我不想为了从一个线程发送一个短字符串到另一个线程而阅读和学习整个课程。