当从EDT (事件分派程序线程)启动新线程时,新线程永远不会是EDT,因为只有一个EDT,对吗?当我看到一些代码检查if (!SwingUtils.isDispatcherThread())时,我想知道它为什么需要这个检查?
我的问题是:当启动新线程时,是什么使其同步(必须等待新线程完成)或异步(新线程立即返回)?因此,如何自行启动同步或异步线程?
使用下面的示例。在EDT中启动非EDT线程时,如下所示:
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()?
发布于 2015-11-13 20:12:13
新的线程永远不会是EDT,因为只有一个EDT,对吗?
正确的。
当我看到一些代码检查时,我在问"if (!SwingUtils.isDispatcherThread())",我想知道它为什么需要这个检查?
因为有时可以从EDT或后台线程调用方法,并且必须根据当前线程的不同而采取不同的操作。
当启动新线程时,是什么使其同步(必须等待新线程完成)或异步(新线程立即返回)?
启动新线程时,新线程总是并发地运行到生成线程。除非您明确地加入(或使用另一种同步机制),否则生成线程永远不会等待所生成的线程完成。
如果doTask()挂起,应该阻止EDT吗?
否,除非例如,生成的线程在保持EDT试图获取的锁时挂起。
如果我无法控制doTask(),并且不能更改方法,那么有什么好方法来处理产生新线程和新线程可能挂起的情况呢?在父线程中使用Thread.join()?
这将更加糟糕:现在EDT也会挂起,从而完全冻结UI,直到挂起的线程停止挂起并终止为止。
如果您有一个挂起的线程,那么修复它正在执行的代码,这样它就不再挂起了。如果您不能修复它,那么请负责该代码的人员修复它。
发布于 2015-11-13 20:16:11
Thread和其他类一样,但是当调用start()时,它会创建一个新线程,如果异步提供Runnable,它将运行run()方法中的任何内容或Runnable.run方法中的任何内容。https://stackoverflow.com/questions/33700872
复制相似问题