如何在eclipse插件中正确运行多线程?

时间:2019-04-03 18:17:23

标签: java eclipse multithreading eclipse-plugin

我的插件检查用户是否闲置了一定时间。利用the example in the documentation的解决方案,我尝试了自己的方法。但是,Eclipse应用程序变得无响应,直到循环结束。

此外,消息框只是一个没有标题和按钮的普通框。有人可以告诉我这段代码有什么问题吗?

@Override
    public void earlyStartup() {
        Display.getDefault().asyncExec(new Runnable() {
            public void run() {                                                              
                //while(true) {
                for (stop=System.nanoTime()+TimeUnit.MINUTES.toNanos(1);stop>System.nanoTime();) {
                Display.getDefault().addFilter(SWT.KeyUp, new Listener() {

                    @Override
                    public void handleEvent(Event event) {
stop=System.nanoTime()+TimeUnit.MINUTES.toNanos(1);
                                System.out.println("checkpoint 1");
}

                });
                }
                Shell shell = new Shell(Display.getDefault());
                 MessageBox dialog =
                            new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
                        dialog.setText("Alert!");
                        dialog.setMessage("You have been idle for the last 3 minutes.");
                        shell.open();

stop=System.nanoTime()+TimeUnit.MINUTES.toNanos(1);
                        System.out.println("checkpoint 2");

            }
        });
}

1 个答案:

答案 0 :(得分:0)

Display.asyncExec不会在单独的线程中运行代码。只要可用,它就会在主UI线程中运行代码。 UI线程将被阻塞,直到代码结束。

相反,您可以在普通的Java线程中运行代码。但是您必须调用asyncExec来执行要从线程运行的任何UI代码。

在您的实际代码中,您应该只调用Display.addFilter 一次。这将添加一个侦听器,此后每次每次按键事件都将被调用。由于这是UI代码,因此您根本无法在后台线程中运行它。

因此,您不能使用显示的循环。您必须跟踪关键侦听器中的内容,并在每次调用侦听器时进行更新。