我创建了一个Callable
,它应该进行syncExec
调用。我将 Callable 委托(delegate)给 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;
}
}
最佳答案
ForkJoinPool.invoke
阻塞当前线程,直到给定的任务完成。 Display.syncExec
等待,直到 SWT UI 线程执行 Display.readAndDispatch
,因此它将永远等待,因为 ForkJoinPool.invoke
正在阻塞 UI 线程。
使用ForkJoinPool.execute
在不阻塞的情况下启动任务,并且代码可以工作。
关于java - Display.syncExec 不在 Callable 内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42573518/