繁体   English   中英

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

[英]How to transfer method call to another thread with some short code?

我有一个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行-更加舒适。

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表达式

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

方法参考

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

可以在这里找到其他最新示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM