나는 게임을 위해 자바로 봇을 쓰고있다. 하나의 스레드는 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(); } }
지금, 내 문제는 내가 MessageList의 쓰기하려면 때문에 나는 그것을 액세스 할 수 동기화 사용해야하는 문제 - 꽤 noobie이다. 그러나이 루프에서 발생하고 메시지를 끊임없이 내 개체를 잠그기 때문에 교착 상태가 발생하고 소켓을 통해 들어오는 및 루프에서 발생합니다.
교착 상태 문제를 해결하려면 어떻게해야합니까?
가장 쉬운 방법은 루프에 일부 일시 중지를 추가하는 것입니다. 당신은'Thread.sleep()'을 사용할 수 있습니다. –
루프에서 100 밀리 초의 일시 중지를 사용하고 있지만, 어떤 이유로 인해 여전히 교착 상태입니다. 멈출 수있는 좋은 시간은 무었입니까? – Jason
잘못 잘못 잘못되었습니다! @ bali182 당신이 그를 조롱하고 있다고 말하십시오! 어떻게 교착 상태에 대한 적절한 해결책이 될 수 있겠습니까? 반면에 정확히 어디에서 교착 상태가 발생합니까? 여기에있는 것은 굶주린 실의 예입니다. 'synchronized' 프리미티브는 당신을위한 해결책이 아니므로 우선 순위가 매겨진 메커니즘을 찾아야합니다. –