繁体   English   中英

与执行器服务冻结混淆

[英]Confusion With Executor Service Freezing

我正在尝试使用Executor Service运行一名摇摆工人,并且发生了一些奇怪的事情。 我目前正在使用newSingleThreadExecutor();方法newSingleThreadExecutor(); 以及执行以下操作;

Future<?> f = execService.submit(swingWorker);
JOptionPane.showMessageDialog(null, "Created Future");
f.get(120, TimeUnit.SECONDS);

发生的事情是,只要不关闭对话框消息框,我的swing worker代码就可以完美运行。 如果我关闭对话框,那么我的应用程序将完全冻结。 我认为该线程已被阻塞,但不确定是什么原因。

如果我在没有execService的帮助下独自运行swingworker,则它可以完美运行,但是当然,超时功能不可用,这就是整个目的。 我应该只使用计时器吗?

谢谢

如果看起来像这样:

public void closeDialog(){
    SwingUtitilies.invokeLater(new Runnable(){
      public void run(){
          Future<?> f = execService.submit(swingWorker);
          JOptionPane.showMessageDialog(null, "Created Future");
          f.get(120, TimeUnit.SECONDS);
      }
    });
}

您正在阻止(挂起)EDT。 f.get()将阻塞,直到Future的处理完成。

Future.get()是一个阻塞调用。 它等待直到任务完成或超时为止。 因此,通过在EDT中调用它,您正在做您尝试使用SwingWorker避免的事情。

我不是Swing专家,但是在Java Concurrency in Practice中 ,提到Swing使用它自己的线程来进行UI管理,并且您不会干涉它。 可能就是问题所在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM