EDT,异步,同步
从EDT(Event Dispatcher Thread)启动新线程时,新线程永远不会是EDT,因为只有一个EDT,对吗?我问,因为我看到一些代码检查if (!SwingUtils.isDispatcherThread())
,我不知道为什么需要这个检查?EDT,异步,同步
我的问题是:什么时候启动一个新线程,它是同步的(必须等待新线程完成)还是异步(新线程立即返回)?相应的如何启动一个同步或异步的线程?
以下列为例。在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 UI应该被阻止?
如果我无法控制doTask()
并且该方法无法更改,那么处理产生新线程和新线程可能会挂起的情况的好方法是什么?在父线程中使用Thread.join()
?
新线程永远不会是EDT,因为只有一个EDT,对吗?
没错。
我在问,因为我看到一些代码检查“if(!SwingUtils.isDispatcherThread())”,我想知道为什么需要这个检查?
因为有时可以从EDT或后台线程调用方法,并且必须根据当前线程采取不同的操作。
开始一个新的线程的时候,是什么使得它同步的(必须等待新的线程来完成)或异步的(新的线程立即返回)?
当你开始一个新的线程时,新线程总是同时运行到产卵线程。除非你明确地加入(或使用另一种同步机制),否则产卵线程永远不会等待产生的线程完成。
如果doTask()挂起,EDT UI应该被阻塞吗?
不,例如,除非产生的线程挂起,同时保持EDT尝试获取的锁定。
如果我无法控制doTask()并且方法无法更改,那么处理产生新线程和新线程可能会挂起的情况的好方法是什么?在父线程中使用Thread.join()?
这会更糟糕:现在EDT也会挂起,从而完全冻结UI,直到挂起的线程停止挂起并终止。
如果你有一个挂起的线程,然后修复它正在执行的代码,以便它不再挂起。如果您无法解决问题,请向负责该代码的人员解决问题。
- EDT:是的,只有1 EDT。你做不会是EDT
- 同步和一步的任何线程:
Thread
在Java中像任何其他一类,但是当你调用start()
它创建运行无论在run()
方法或在Runnable.run方法是一个新的线程如果Runnable是异步提供的。 - 方法可能会阻塞/永不返回:关键是要使用回调/侦听器...在导致更新的处理中的某个点被调用的方法。没有通用的解决方案来停止被阻塞的线程,但是在很多情况下可以工作的两种机制是(a)如果您正在等待输入流或阅读器上的数据,或者(b)线程,则为InputStream/Reader.close()。中断
谢谢你的回复。挂线需要睡觉()才能被打断,对吗? – user3014901
谢谢!只想确认: – user3014901
谢谢!只是想确认一下:(1)你的意思是一个新的Thread.start()默认情况下总是立即返回父线程?或者它取决于?通过并发,你的意思是父线程和新线程有相同的机会被安排运行,并且它们被随机调度运行? (2)我的期望是如果产卵的非EDT线程挂起,EDT线程就会运行。这不可行吗? – user3014901
1.是的。是的。 2.如果任何其他线程挂起,EDT线程将继续运行。他们同时运行。 –