Synchronization 在同步块中使用分叉ProgressMonitorDialog
我正在使用jface ProgressMonitorDialog缓存一些数据。这是在同步块中完成的,以避免遇到并发问题 但奇怪的是,如果我使用参数fork=true调用ProgressMonitorDialogrun,则同步块不起作用 有人能给我解释一下这里发生了什么事吗 输出:Synchronization 在同步块中使用分叉ProgressMonitorDialog,synchronization,jface,Synchronization,Jface,我正在使用jface ProgressMonitorDialog缓存一些数据。这是在同步块中完成的,以避免遇到并发问题 但奇怪的是,如果我使用参数fork=true调用ProgressMonitorDialogrun,则同步块不起作用 有人能给我解释一下这里发生了什么事吗 输出: start synchronization Thread[main,5,main] start synchronization Thread[main,5,main] finished synchronization
start synchronization Thread[main,5,main]
start synchronization Thread[main,5,main]
finished synchronization Thread[main,5,main]
finished synchronization Thread[main,5,main]
代码:
私人空隙试验{
外壳=新外壳;
SyncTest st=新的SyncTestshell;
shell.getDisplay.AsyncExecuteNew Runnable{
@凌驾
公开募捐{
圣多斯姆;
}
};
shell.getDisplay.AsyncExecuteNew Runnable{
@凌驾
公开募捐{
圣多斯姆;
}
};
}
私有静态类同步测试{
私有静态最终对象锁=新对象;
私人壳牌;
公共SyncTestShell{
this.shell=shell;
}
公共无效文件{
同步锁{
System.out.printlnstart同步+Thread.currentThread.toString;
试一试{
ProgressMonitorDialog pmd=新的ProgressMonitorDialogshell;
pmd.runtrue,true,新建iRunTableWithProgress{
@凌驾
public void runIProgressMonitor监视器引发InvocationTargetException、InterruptedException{
线程1000;
}
};
}catch InvocationTargetException | InterruptedException e{
e、 打印跟踪;
}
System.out.PrintLn完成同步+Thread.currentThread.toString;
}
}
}
您正在使用Display.asyncExec将这两个doSmth调用放入可运行文件列表中,一旦调用Display.readAndDispatch,该列表将在UI线程中运行
因此,对doSmth的第一个调用将运行并进入synchronized块
然后调用pmd.run with fork true。这将在单独的线程中运行runnable,并反复调用Display.readAndDispatch以保持UI线程的响应性
这些Display.readAndDispatch调用将拾取对doSmth的第二个调用-但是您仍然在同步块内,并且仍然在同一UI线程上,因此同步不会阻塞,您将获得观察到的结果
如果要在后台运行代码,请使用作业并指定“调度规则”,以防止任何冲突的第二个作业同时运行。如果作业中设置了setUsertrue,它将显示一个进度对话框