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
运行。你能测试一下吗?