我在学习Java线程时遇到了这个问题:对于有两个工作线程的Swing应用程序,EDT正在等待GUI事件,两个工作人员都在等待。这被认为是一个僵局的应用程序吗?
当应用程序在等待用户输入时,我觉得它与“空闲状态”非常相似。但如果不是,这种情况会出现什么样的僵局? EDT正在等待,两名工人都在跑?
答案 0 :(得分:0)
死锁场景是指你有2个线程(或n个theads)在继续之前等待彼此完成 - 这将永远不会发生。
如果Event Dispatch Thread
(单个线程在这里n = 1),如果您向EDT提交新任务,例如通过SwingUtilities.invokeAndWait())
从已在EDT中执行的代码中提交,则可以使线程死锁。
这样,SwingUtilities.invokeAndWait(Runnable)
将一直等到提交Runnable
完成,但事实上它永远不会开始执行,因为它已入队,直到EDT空闲(whitch是当前线程) - 这永远不会发生。
应用程序填充冻结,你只能移动窗口,而不是调整它的大小(你将改变大小,但它不会被修复)
请不要误解空闲状态和死锁。空闲意味着线程无所事事,例如等待新任务。死锁是编程中的错误,必须避免。