即使在新线程中运行,Java SWT UI线程也会冻结

时间:2015-07-31 12:14:49

标签: 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()期间,我的对话框不可移动,如果我点击它就变成了#34;不负责任的"。

我做错了吗?

2 个答案:

答案 0 :(得分:4)

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

所以替换

}).run();

}).start();

答案 1 :(得分:3)

尝试.start()代替.run()