我试图在Java中创建一个事件调度程序,将事件分派为线程。所以所有的EventListener类实质上都是Runnable类的实现。就像传统的事件触发一样,事件分派器类中的方法循环遍历EventListeners列表,然后调用它们的处理程序方法,除了这一次,我通过将这些处理程序放入新的Thread(handlerObject)来将这些处理程序作为线程来调用。开始()。实际的处理是在EventListener的run()方法中完成的。线程进入死锁,尽管同步关键字
所以它看起来是这样的:
for(EventListener listener : listenerList) {
if(listener instanceof Runnable)
new Thread(listener).start();
}
因此,所有的指令以处理侦听器的事件都放在run()方法中,将被执行时thread.start()。
但问题是线程经常进入一种情况,其中一个线程卡住某处并且无法继续。有时候,有些线程可能会卡住,而有些线程设法运行侦听器run()方法中的所有指令。我抬起头,这听起来像是所谓的僵局。
我试图把“同步”修饰符放到我所有的方法中,但它仍然有这个问题。我认为synchronized关键字只是简单地排队尝试运行类似方法的任何线程,直到运行该方法的当前线程完成。但这并不能解决问题。为什么不同步解决问题,尤其是当我已经在我的所有方法上都有它时,它应该排队任何可能导致死锁的并发访问?我没有使用任何wait()或notify()方法。只是一个简单的事件调度程序,试图将其事件监听程序作为线程运行。
我对线程来说很新,但发现很难调试它,因为我不知道哪里出了问题。
感谢您的任何帮助。
FWIW,线程一般不会进入死锁**,除了**使用同步时。同步可以防止竞争条件,但会引入死锁的可能性。 – 2011-06-07 02:01:03
真的很难回答你对你提供的信息的问题(你提供的循环看起来很好)。人们可能不得不看你的run()的实现来查看问题。你所遇到的可能不一定是死锁,它可能也是你的线程被一些非常长的I/O操作等阻塞。发布更多的代码给我们看,所以我们可以帮助你更好:)哦和任何体面的JAVA IDE应该可以让你暂停一个线程。试试Google“调试多线程java程序” – Alvin 2011-06-07 02:32:48