即使在新线程中运行,Java SWT UI 线程也会卡住

标签 java multithreading user-interface swt

我对长时间运行的任务有疑问。

显示对话框后,我想扫描一个 ftp 目录。此任务需要一些时间,因此我需要在 UI 线程中运行此任务。

我的想法是

@Override
protected void postDialogOpen() {

    // if invoked via menu button
    if (!scanFtp) {

        final Display display = Display.getDefault();

        new Thread(new Runnable() {

            @Override
            public void run() {

                //initProgressWaitViewer();

                scanFtpServer();

                //closeProgressWaitViewer();

                display.syncExec(new Runnable() {

                    @Override
                    public void run() {
                        updateTree();
                    }

                });

            }

        }).run();

    }

}

但是在执行 scanFtpServer() 期间,我的对话框是不可移动的,如果我点击它,它就会变得“不负责任”。

我做错了什么吗?

最佳答案

当调用 Thread 类中的方法 run() 时,您是在调用者线程上执行该方法,就像调用任何其他方法一样。如果你想产生一个新线程并在该线程中执行方法 run(),你需要调用方法 start(),这将完成所有设置工作启动线程并运行它。

所以替换

}).run();

}).start();

关于即使在新线程中运行,Java SWT UI 线程也会卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31745956/

相关文章:

c# - TAP的多任务处理

java - Thread.sleep() 是否使 UI 线程进入休眠状态?

c++ - 如何在 QPixmap 图像中绘制一个点?

javascript - jquery展开折叠效率

python - Python 中的动态图表

java - 我可以修改 osgi 包内的文件吗?

java - 如何实例化静态嵌套类的内部类?

c++ - std::thread --- 没有匹配的构造函数

java - 如何为Jpanel设置模型?

java - 即使在 2 个不同的 JVM 中,我们如何确保任何应用程序只有一个实例在运行