Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Display.syncExec在Callable内部不工作_Java_Concurrency_Eclipse Plugin_Runnable_Callable - Fatal编程技术网

Java Display.syncExec在Callable内部不工作

Java Display.syncExec在Callable内部不工作,java,concurrency,eclipse-plugin,runnable,callable,Java,Concurrency,Eclipse Plugin,Runnable,Callable,我创建了一个Callable,它应该进行syncExec调用。我将Callable委托给RecursiveTask(ForkJoinPool)的子类,该子类执行Callable的call方法。问题是,run方法中的代码永远无法到达。你知道为什么以及如何解决这个问题吗 public class someClass{ public static void main (String[] args){ Callable<Object> c = new Callab

我创建了一个
Callable
,它应该进行
syncExec
调用。我将Callable委托给
RecursiveTask(ForkJoinPool)
的子类,该子类执行
Callable
call方法。问题是,
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;
    }
}
公共类someClass{
公共静态void main(字符串[]args){
可调用c=新的可调用(){
@凌驾
公共对象调用()引发异常{
PlatformUI.getWorkbench().getDisplay().syncExec(新的Runnable(){
@凌驾
公开募捐{
System.out.println(“hi”);
}
});
返回null;
}
});
ATLockTask任务=新建ATLockTask();
task.setCallable(c);
ForkJoinPool池=新的ForkJoinPool();
调用(任务);
}
}
公共类ATLockTask扩展了RecursiveTask{
可调用的可调用的;
@凌驾
受保护对象[]计算(){
试一试{
callable.call();
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
}

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


使用
ForkJoinPool.execute
在不阻塞的情况下启动任务,代码就能工作。

您在控制台中看到堆栈跟踪了吗?我们需要看到一些更接近实际测试的东西。我不知道如何将该示例缩小。这是最简单的完整示例。@RüdigerHerrmann否未到达printStackTrace。调用方法未完成。现在,我创建了一个完整的示例,您可以对其进行测试。这很有意义。但是,即使我使用execute而不是invoke,我的run方法也不起作用。奇怪的是,run方法在这个.wait()上有库存,尽管当前线程是forkjoinworker,但是您仍然没有给我们一个正确的测试方法,我们可以在不猜测代码使用方式的情况下进行测试。我获取了您当前的代码,将其修复为编译并在Eclipse插件中运行,在使用
execute
时,它工作正常,而没有使用
invoke
运行。你能测试一下吗?