Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 从ModalContext线程通知WorkerPool_Java_Multithreading_Swt - Fatal编程技术网

Java 从ModalContext线程通知WorkerPool

Java 从ModalContext线程通知WorkerPool,java,multithreading,swt,Java,Multithreading,Swt,你好, 我正在尝试获取一个实现,该实现在每个ModalContext线程中等待UI操作完成后的所有作业,其中: 将创建计划作业的侦听器 在每个Display.syncExec的UI线程中调用UI操作 所有计划的作业都会等待,如果其中一个挂起的时间太长,则会被取消 以notifyAll()通知 通过在UI线程本身中调用一段代码并在它之后调用我的方法来工作,因此我将侦听器创建移到构造函数中,一切都很好,直到我们到达notifyAll()案例,该案例针对具有巨大延迟的调度工作(WorkerPool被放

你好, 我正在尝试获取一个实现,该实现在每个ModalContext线程中等待UI操作完成后的所有作业,其中:

  • 将创建计划作业的侦听器
  • 在每个Display.syncExec的UI线程中调用UI操作
  • 所有计划的作业都会等待,如果其中一个挂起的时间太长,则会被取消 以notifyAll()通知
  • 通过在UI线程本身中调用一段代码并在它之后调用我的方法来工作,因此我将侦听器创建移到构造函数中,一切都很好,直到我们到达notifyAll()案例,该案例针对具有巨大延迟的调度工作(WorkerPool被放入60秒等待()。我无法让它不抛出非法MonitorStateException

    在上一个实现中,它只作为notifyAll()工作。没有同步块,什么都没有,所以我希望它在新实现中与Display.syncExec(notifyAll())一起工作,因为导致作业的代码段在UIThread中运行,但它没有。asyncExec或在ModalContext线程中运行它都不起作用。我也尝试了几个同步块,但我看不出它们考虑之前实现的逻辑原因

    此时新的实现代码:

    protected void updateUI() {    
      Display display = getDisplay();
      IRunnableWithProgress op = m -> {
        //Paint
        display.syncExec(() -> display.getActiveShell().layout(true, true));
        waitUntilAllJobsHaveFinished2(display);
      };
      try {
        ModalContext.run(op, true, new NullProgressMonitor(), display);
      } catch (InvocationTargetException | InterruptedException e) {
        Log.logException("", e); //$NON-NLS-1$
      }
    }
    
    private void waitUntilAllJobsHaveFinished2(Display display) {
      Instant start = Instant.now();
      while (!scheduledJobs.isEmpty()) {
        //Avoid infinite loop from some jobs.
        if (Instant.now().minusSeconds(5).isAfter(start)) {
          display.syncExec(() -> notifyAll());
          System.out.println("---\nToSting: " + scheduledJobs + "\nSize: " + scheduledJobs.size());
          start = Instant.now();
        }
      }
    }
    

    什么是
    notifyAll()
    ?使用
    IJobManager.join
    等待一系列作业完成。在较新版本的中还有
    JobGroup
    Eclipse@greg-449我试图中断WorkerPool.sleep()中的wait(),否则它会毫无意义地等待一分钟。有点像是通过反复试验才做到的。将调查JobManager和JobGroup。工作经理似乎正是我需要的。非常感谢。工作经理负责管理员工库,并在需要时叫醒他们。@greg-449我很困惑。我尝试了
    Job.getJobManager().join()
    ,但它陷入了死锁/永远挂起<代码>作业管理器未挂起,
    作业的
    状态为
    正在运行
    。从JavaDoc for
    IJobManager.join()
    关于死锁,假设它确实是由拥有一个等待的锁引起的,我想我确实需要某种形式的
    notify()/notifyAll()
    ,但在我尝试它的那一刻,我得到了
    IllegalMonitorStateException