java - Display.syncExec 不在 Callable 内部工作

标签 java concurrency eclipse-plugin runnable callable

我创建了一个Callable,它应该进行syncExec调用。我将 Callable 委托(delegate)给 RecursiveTask (ForkJoinPool) 的子类,该子类执行 Callablecall 方法。问题是永远不会到达 run 方法内的代码。您知道为什么以及如何解决这个问题吗?

public class someClass{

    public static void main (String[] args){

        Callable<Object> c = new Callable<Object>() {

            @Override
            public Object call() throws Exception {

                PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {

                    @Override
                    public void run() {
                         System.out.println("hi");
                    }

                });

                return null;
            }
        });
        ATLockTask task = new ATLockTask();
        task.setCallable(c);
        ForkJoinPool pool = new ForkJoinPool();
        pool.invoke(task);
    }

}


public class ATLockTask extends RecursiveTask<Object[]>{

    Callable callable;

    @Override
    protected Object[] compute() {

        try {
            callable.call();
        } catch (Exception e) {
            e.printStackTrace();
        }


        return null;
    }
}

最佳答案

ForkJoinPool.invoke 阻塞当前线程,直到给定的任务完成。 Display.syncExec 等待,直到 SWT UI 线程执行 Display.readAndDispatch,因此它将永远等待,因为 ForkJoinPool.invoke 正在阻塞 UI 线程。

使用ForkJoinPool.execute在不阻塞的情况下启动任务,并且代码可以工作。

关于java - Display.syncExec 不在 Callable 内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42573518/

相关文章:

java - 如果 echo $JAVA_HOME 显示两次用冒号分隔的相同路径可以吗?

java - 构造 http POST 请求的问题

java - 如何从线程向 ExecutorService 提交 Callable

java - 如何在 PropertyPages 中对 "Restore Defaults"和 "Apply"按钮进行编程

java - Java 版本 : Java 6 (in Terminal, Eclipse)和 Java 7(在 Java 控制面板中)的差异来源是什么?

java - 从插件调用代码时出现问题:“org.eclipse.equinox.preferences”

Java DNS 后缀

java - 用 Java 直接从 Google Drive 读取

c++ - std::call_once,应该什么时候用?

python - 子类化属性在 __init__ 上引发 TypeError