【问题标题】:Display.syncExec not working inside CallableDisplay.syncExec 在 Callable 中不起作用
【发布时间】:2017-03-03 07:56:51
【问题描述】:

我创建了一个Callable,它应该进行syncExec 调用。我将 Callable 委托给 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;
    }
}

【问题讨论】:

  • 您在控制台中看到堆栈跟踪吗?
  • 我们需要看到更接近minimal reproducible example 的东西,我们可以实际测试。
  • 我不知道如何使该示例更小。这是最小的完整示例。
  • @RüdigerHerrmann 不,未达到 printStackTrace。调用方法没有完成。它只是在 syncExec 语句处停止。
  • 现在,我创建了一个您可以测试的完整示例。

标签: java concurrency eclipse-plugin runnable callable


【解决方案1】:

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

使用ForkJoinPool.execute无阻塞启动任务,代码正常运行。

【讨论】:

  • 这是有道理的。但即使我使用执行而不是调用,我的运行方法也不起作用。
  • 奇怪,虽然当前线程是 ForkJoinWorker,但 run 方法在 this.wait() 中获取库存
  • 好吧,您实际上还没有给我们一个合适的minimal reproducible example,我们可以测试它而不必猜测您是如何使用代码的。我采用了您当前的代码,将其修复为编译并在 Eclipse 插件中运行,它在使用 execute 时可以正常工作,但不能在 invoke 下运行。
  • stackoverflow.com/questions/42579230/… 你能测试一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
相关资源
最近更新 更多