java - 如何用一些简短的代码将方法调用转移到另一个线程?

标签 java multithreading swing

我有一个 Gui 类,应该更新 GUI,它在 Swing 主线程中运行,并且必须从该线程访问。我有一些方法可以改变 Gui 中显示的内容。其中一些方法可能会从其他线程调用。我最终得到了这段代码:

   public void changeSomethingInGui() {
     change button enabled state for example...
   }
   public void changeSomethingInGuiAsync() {
     SwingUtilities.invokeLater(new Runnable() {
       @Override
       public void run() {
         Gui.this.changeSomethingInGui();
       }
     });
   }

这真的很糟糕,还有 5 个类似的方法,而且这个策略将需要很多行完全无用的(对于读者)代码。

没有比 java 更糟糕的处理回调方法了,这是肯定的,但是没有一些解决方法吗?例如,在 C++ 中,我可以将方法作为回调发布到这样的线程(使用 boost 库):

guiThreadClass.queueAction(boost::bind(Gui::DoSomethingInGui, guiInstance, param1, param2));

一行。这将使我的类(class)中的每个方法都变成 3 行——更加舒适。

最佳答案

Java 8 ,给定这个方法

public void changeSomethingInGui() {
    //change button enabled state for example...
}

您可以替换此调用

public void changeSomethingInGuiAsync() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            Gui.this.changeSomethingInGui();
        }
    });
}

带有 lambda expression

public void changeSomethingInGuiAsync() {
    EventQueue.invokeLater(() -> {
        Gui.this.changeSomethingInGui();
    });
}

method reference

public void changeSomethingInGuiAsync() {
    EventQueue.invokeLater(Gui.this::changeSomethingInGui);
}

可以找到其他最近的示例 here .

关于java - 如何用一些简短的代码将方法调用转移到另一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34602911/

相关文章:

java - 这段代码中是否存在竞争条件?

java - 信号量不起作用

java - 如何为JTable的表头设置光标?

java - 重置 ObjectOutPutStream 以更新新对象状态?

java - 加密和解密两个系统之间的消息

java - 中断 DatagramSocket.receive 中的线程

java - 如何获取默认的Frame作为父组件?

java - 分析软件--跟随行动--这叫什么?

java - Jvm heapdump 不是由信号生成的

java - Android:使用两个 View 进行缩放