我正在为Java游戏编写一个Java程序。一个线程为Manager和Worker线程管理时间并为它们发送检测信号。 Manager收集并解释来自服务器的消息,并且Worker线程从Manager接收命令(具有类中的详细信息)并对此信息起作用。Java中的多线程死锁
现在,我遇到了多线程死锁问题,我不确定是否有替代方案。
以下是我的管理器类中的一些方法:当用户单击按钮时,我从GUI线程中调用getMessageFromUsername。以下方法从另一个线程中调用。
private ArrayList<Message> MessageList = new ArrayList<>();
public synchronized Message getMessageFromUsername(String username) {
for(Message msg : MessageList) {
if(msg.username.equalsIgnoreCase(username)) {
Message m = new Message(msg.num, msg.username, msg.id);
return m;
}
}
return null;
}
我的管理器线程从套接字读取信息,并在连续循环中向MessageList添加信息。 (另外一个,即)
private synchronized void parseMessage() {}
private void main() { while(1) { parseMessage(/*Adds message to MessageList*/); Sleep(); } }
现在,我的问题是一个相当noobie发出─因为如果我要写信给我MessageList中必须使用同步访问。但是,由于这发生在一个循环中,并且消息不断通过套接字进入,它会导致死锁,因为它会一直锁定我的对象,并且这发生在循环中。
我该怎么做才能解决死锁问题?
最简单的方法是在循环中添加一些暂停。你可以使用'Thread.sleep()' –
我在我的循环中使用了100毫秒的暂停,但由于某种原因它仍然发生死锁。什么是暂停的好时机? – Jason
错错了错! @ bali182请说你在拖他!睡眠怎样才能成为僵局的妥善解决方案?另一方面,你究竟在哪里看到了僵局?你在这里是一个饥饿的线程的例子。 '同步的'原语不适合你,你应该选择一些优先机制。 –