C# Action Delegate 的 Java invokeAndWait

标签 java multithreading

我在this post中提到的问题实际上是由于跨线程 GUI 问题而发生的(我希望如此)。

您能帮我处理 Java 版本的操作委托(delegate)吗?

在 C# 中,它是这样内联完成的:

        this.Invoke(new Action(delegate()
        {...}));

这在 Java 中是如何实现的?

谢谢。

public class processChatMessage implements Observer {

    public void update(Observable o, Object obj) {


        System.out.println("class class class" + obj.getClass());

        if (obj instanceof String){

            String msg = (String)obj;

            formatChatHeader(chatHeader.Away, msg);

            jlStatusBar.setText("Message Received");

            // Show chat form
            setVisibility();

        }
    }
}

processChatMessage 由从远程节点接收新数据触发的单独线程调用。

我认为错误是在尝试更新 GUI 控件时产生的。

你认为是这个原因吗?我问这个问题是因为我对 Java 和 C# 很陌生,但这就是我认为正在发生的事情。

解决方案:

public class processChatMessage implements Observer {

    public void update(Observable o, Object obj) {

        if (obj instanceof String){

            final String msg = (String)obj;

            try {

                SwingUtilities.invokeAndWait(new Runnable( ) {

                    public void run( ) {

                        formatChatHeader(chatHeader.Away, msg);
                        jlStatusBar.setText("Message Received");
                        setVisibility();
                    }
                });
            } catch (InterruptedException e){

            } catch (InvocationTargetException e){

            }
        }
    }
}

最佳答案

最接近的等价物可能是 Runnable 接口(interface) - 基本上是一个单方法接口(interface),其方法不带参数且不返回任何值。您可以使用匿名内部类来实现类似于匿名方法的效果:

executeRunnable(new Runnable() {
    public void run() {
        // Do stuff here
    }
});

是的,这有点冗长...但是希望 Java 7 闭包最终能够解决问题:)

现在,这就是 Action 委托(delegate)的一般思想。在这个特定实例中,您应该将SwingUtilities.invokeLater(Runnable)SwingUtilities.invokeAndWait(Runnable)视为的粗略等效项分别是 Control.BeginInvokeControl.Invoke

关于C# Action Delegate 的 Java invokeAndWait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2850865/

相关文章:

java - Apache Kafka UnresolvedAddressException 发送消息时

java - 如何找到基于 Spring 的 Web 应用程序中的性能瓶颈

java - 使用 Java 嵌入高可用性模式的 Neo4j

java - 在 Android 中动画旋转图像

java - 关于Thread的逻辑问题

java - 如何在 Dagger 2 中添加未知数量的未知模块?

java - 异步任务的线程池?

multithreading - 使用 GO 时如何测量系统过载

php - 具有多线程持久化和刷新的 Doctrine Entity Manager

multithreading - 我如何在 ghc-7.4 中使用带有 gtk2hs 的线程?