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

时间:2016-01-05 01:42:00

标签: 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));

一条线。这将使我的班级中的每种方法都有3行 - 更加舒适。

1 个答案:

答案 0 :(得分:2)

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