首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EDT,异步的,同步的

EDT,异步的,同步的
EN

Stack Overflow用户
提问于 2015-11-13 20:02:30
回答 2查看 670关注 0票数 2

当从EDT (事件分派程序线程)启动新线程时,新线程永远不会是EDT,因为只有一个EDT,对吗?当我看到一些代码检查if (!SwingUtils.isDispatcherThread())时,我想知道它为什么需要这个检查?

我的问题是:当启动新线程时,是什么使其同步(必须等待新线程完成)或异步(新线程立即返回)?因此,如何自行启动同步或异步线程?

使用下面的示例。在EDT中启动非EDT线程时,如下所示:

代码语言:javascript
复制
public void actionPerformed(final ActionEvent e)
{
    final Runnable runnable = new Runnable()
    {
      @Override
      public void run()
      {
        //do some non-gui task. The task is not long-running, but 
        //could be blocked
        doTask();       
      }
    }; 

    new Thread(runnable).start();
  }
});

非EDT线程是由EDT同步还是异步生成的?如果doTask()挂起,应该阻止EDT吗?

如果我无法控制doTask(),并且无法更改方法,那么有什么好方法来处理产生新线程和新线程可能挂起的情况呢?在父线程中使用Thread.join()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-13 20:12:13

新的线程永远不会是EDT,因为只有一个EDT,对吗?

正确的。

当我看到一些代码检查时,我在问"if (!SwingUtils.isDispatcherThread())",我想知道它为什么需要这个检查?

因为有时可以从EDT或后台线程调用方法,并且必须根据当前线程的不同而采取不同的操作。

当启动新线程时,是什么使其同步(必须等待新线程完成)或异步(新线程立即返回)?

启动新线程时,新线程总是并发地运行到生成线程。除非您明确地加入(或使用另一种同步机制),否则生成线程永远不会等待所生成的线程完成。

如果doTask()挂起,应该阻止EDT吗?

否,除非例如,生成的线程在保持EDT试图获取的锁时挂起。

如果我无法控制doTask(),并且不能更改方法,那么有什么好方法来处理产生新线程和新线程可能挂起的情况呢?在父线程中使用Thread.join()?

这将更加糟糕:现在EDT也会挂起,从而完全冻结UI,直到挂起的线程停止挂起并终止为止。

如果您有一个挂起的线程,那么修复它正在执行的代码,这样它就不再挂起了。如果您不能修复它,那么请负责该代码的人员修复它。

票数 2
EN

Stack Overflow用户

发布于 2015-11-13 20:16:11

  1. 是的,只有一个美国东部时间。您制作的任何线程都不会是EDT。
  2. 同步与异步: java中的Thread和其他类一样,但是当调用start()时,它会创建一个新线程,如果异步提供Runnable,它将运行run()方法中的任何内容或Runnable.run方法中的任何内容。
  3. 方法可能阻塞/永不返回:此方法的关键是使用回调/侦听器.在处理过程中的某个点调用导致更新的方法。停止阻塞的线程没有通用的解决方案,但是在许多情况下可以工作的两种机制是:(a) inputstream /Reader.close(),如果您在等待输入流或读取器上的数据,或者(b) Thread.interrupt
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33700872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档