Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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

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 SwingUtilities.invokeAndWait不等待?_Java_Multithreading_Macos_Swing - Fatal编程技术网

Java SwingUtilities.invokeAndWait不等待?

Java SwingUtilities.invokeAndWait不等待?,java,multithreading,macos,swing,Java,Multithreading,Macos,Swing,下面的代码运行良好 abstract class FunctionRunnable<V> implements Runnable { protected abstract V calculate(); private V result; private Throwable thr; public synchronized final void run() { try { result = calculate(); } catch

下面的代码运行良好

abstract class FunctionRunnable<V> implements Runnable {
  protected abstract V calculate();
  private V result;
  private Throwable thr;

  public synchronized final void run() {
    try {
      result = calculate();
    }
    catch (Throwable thr) {
      this.thr = thr;
    }
  }

  public synchronized final V getResult() {
    if (thr != null) {
      throw new RuntimeException(thr);
    }
    return result;
  }
}

...
final FunctionRunnable<Boolean> runnable = new FunctionRunnable<Boolean>() {
  public Boolean calculate() {
    return doCalculation();
  }

  private boolean doCalculation() {
    ...
  }
});
SwingUtilities.invokeAndWait(runnable);
final Boolean resultObj = runnable.getResult();
final boolean result = resultObj.booleanValue();
抽象类函数Runnable实现Runnable{
受保护的抽象V计算();
私人V结果;
私人可丢弃thr;
公共同步的最终作废运行(){
试一试{
结果=计算();
}
捕获(可丢弃的thr){
this.thr=thr;
}
}
公共同步的最终V getResult(){
如果(thr!=null){
抛出新的运行时异常(thr);
}
返回结果;
}
}
...
final FunctionRunnable runnable=新函数runnable(){
公共布尔计算(){
返回doccalculation();
}
私有布尔数据计算(){
...
}
});
SwingUtilities.invokeAndWait(可运行);
最终布尔结果bj=runnable.getResult();
最终布尔结果=resultObj.booleanValue();
直到苹果发布1.6.0_31,我们的应用程序用户有时会在最后一行获得NPE

您是否看到代码中存在错误,或者其他人是否发现此特定Java更新存在类似问题?

My SSCCE:

public abstract class FunctionRunnable<V> implements Runnable {
  private V result;
  private Throwable thr;

  protected abstract V calculate();

  public synchronized final void run() {
    try { result = calculate(); } catch (Throwable thr) { this.thr = thr; }
  }

  public synchronized final V getResult() {
    if (thr != null) throw new RuntimeException(thr);
    return result;
  }

  public static void main(String[] args) throws Exception {
    final FunctionRunnable<Boolean> runnable = new FunctionRunnable<Boolean>() {
      public Boolean calculate() { return doCalculation(); }
      private boolean doCalculation() {
        try { Thread.sleep(2000); } catch (InterruptedException e) {}
        return false;
      }};
    SwingUtilities.invokeAndWait(runnable);
    System.out.println(runnable.getResult().booleanValue());
  }
}

启动,运行2秒钟,打印
false

我有时会收到NullPonterExeption。。。。诡异的

java版本“1.6.0_31” Java(TM)SE运行时环境(构建1.6.0_31-b04-415-11M3635)
Java HotSpot(TM)客户端VM(构建20.6-b01-415,混合模式)

如果查看EventQueue.invokeAndWait的实现,您会发现它无法正确处理虚假唤醒。它调用lock.wait(),然后不检查runnable是否实际完成了执行-这意味着invokeAndWait可以在runnable完成执行之前返回

出于某种原因,MacOS上的update 31开始以合理的频率出现虚假唤醒,从而暴露了EventQueue中长期存在的错误。我不确定发生了什么变化,这在任何其他版本的Java中都不会发生


我们通过实现我们自己的invokeAndWait方法来解决这个问题,方法是通过一个简单的布尔检查来完成runnable。

您是从EDT调用invokeAndWait(),还是从另一个线程调用?@JBNizet NPE不是预期的结果。javadoc只是说:“不应该从EventDispatchThread调用它。”。但它没有说明如果从EDT打电话会发生什么。因此,结果可能尚未确定。它是从非EDT线程调用的。我觉得您的代码很好。如果你真的在上面的代码中遇到这个异常,它看起来像是一个bug。对我来说,它也总是返回false,即使循环100000次。但几周以来,我们收到了类似的例外情况,只有使用1.6.0_31的OS X用户例外。那么,您的意思是,您无法创建引发问题的SSCCE?那么,你真的不知道问题是在这个代码内还是与一些完全无关的东西。这个问题是不可靠的,可复制的:我相应地改变了这个问题。是的,但你说你从来没有使用发布的代码复制过它?这是我担心的问题。非常感谢。我现在正尝试使用
invokeLater
和包装runnable来模拟
invokeAndWait
$java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-11M3635)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-415, mixed mode)