Synchronization 在同步块中使用分叉ProgressMonitorDialog

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

我正在使用jface ProgressMonitorDialog缓存一些数据。这是在同步块中完成的,以避免遇到并发问题

但奇怪的是,如果我使用参数fork=true调用ProgressMonitorDialogrun,则同步块不起作用

有人能给我解释一下这里发生了什么事吗

输出:

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,它将显示一个进度对话框