【问题标题】:Java SWT UI Thread freeze even if run in new Thread即使在新线程中运行,Java SWT UI 线程也会冻结
【发布时间】:2015-10-23 02:53:03
【问题描述】:

我遇到了长时间运行的任务的问题。

显示我的对话框后,我想扫描一个 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() 期间,我的对话框是不可移动的,如果我点击它,它就会变成“不负责任的”。

是不是我做错了什么?

【问题讨论】:

  • 使用start() 执行线程。如果这不能解决所有问题..可能需要更多代码..

标签: java multithreading user-interface swt


【解决方案1】:

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

所以替换

}).run();

}).start();

【讨论】:

    【解决方案2】:

    尝试使用.start() 而不是.run()

    【讨论】:

    • 是的,你是对的!转储问题。调用 run 方法当然会在当前(UI 线程)上启动它。
    • 你可以接受这个答案或者更详细的@rhobincu 的答案。让人们知道这个问题已经解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多