我有一个 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();
}
});
}
public void changeSomethingInGuiAsync() {
EventQueue.invokeLater(() -> {
Gui.this.changeSomethingInGui();
});
}
public void changeSomethingInGuiAsync() {
EventQueue.invokeLater(Gui.this::changeSomethingInGui);
}
可以找到其他最近的示例 here .
关于java - 如何用一些简短的代码将方法调用转移到另一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34602911/