내 프로그램이 멈추기 전까지는 더 적은 메시지를 보내고 약 20 초 후에 실행된다. 나는 스레드 덤프를 만들었어요 그리고 스레드가 중지 코드의 다음 줄에 나 포인트 :쓰레드는 소켓/프린트 라이더 상호 작용에 매달린다.
if(s.isClosed() || !s.isConnected() || s.isInputShutdown() || s.isOutputShutdown() || out == null || out.checkError()) {
이
"class xxx.xxx.xxx" prio=10 tid=0x000000000200d800 nid=0x6e7f waiting for monitor entry [0x00007f63172b6000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.io.PrintWriter.flush(PrintWriter.java:291)
- waiting to lock <0x00000000ec810218> (a java.io.BufferedWriter)
at java.io.PrintWriter.checkError(PrintWriter.java:330)
이 스레드 덤프 정보는 지적 내 스레드 덤프의 일부입니다 문제는 Printwriter.checkError()에 있습니다. 그러나 나는 그것이 왜 여기서 멈출 것인지 이해할 수 없다.
아래 코드는 상황에 맞는 코드입니다.
public void parseMessage(final byte[] bytes) {
synchronized (receivers) {
for (final Socket s : receivers.keySet()) {
final PrintWriter out = receivers.get(s);
if(s.isClosed() || !s.isConnected() || s.isInputShutdown() || s.isOutputShutdown() || out == null || out.checkError()) {
receivers.remove(s);
failedToConnect(s.getInetAddress().getHostAddress(), s.getPort());
continue;
}
queue.add(out, bytes);
}
}
}
업데이트 14 januari (수신기가 Map<Socket, PrintWriter>
이다) (그리니치 표준시 10시 + 1) :
대신하는 차 BufferedWriter
업데이트 14 januari와 PrintWriter
(그리니치 표준시 16시 +1) :
나는 더 많은 테스트를 해봤지만 일부 네트워크/독자들이 문제를 일으키고 있습니다. 응용 프로그램은 일부 외부 네트워크 (인터넷을 통해)의 일부 독자에게 내부 네트워크 및 일부 독자에게 데이터를 보냅니다. 이것이 정확히 무엇을 일으키는지는 아직까지는 알 수 없지만 몇 가지 단서가 있습니다. 몇 가지 다시 시작한 후 두 네트워크 간의 연결이 닫히지 않았으므로 연결이 열린 상태를 유지할 수있었습니다. 나는 아직도 정확히 무슨 일이 일어나고 있는지 모르지만 그것이 네트워크 문제라고 생각합니다. 서버 측에서는 연결은 "FIN_WAIT1"에 있고 판독기 쪽에서는 "ESTABLISHED"로 유지됩니다. 그것은 신호가 그것을 닫으려면 전송되었습니다조차도 독자가 연결을 닫으려고 신호하지 않을 것 같습니다. 스레드가 차단
사이드 댓글 :'for (최종 Map.Entry <소켓, PrintWriter> 전자 : receivers.entrySet()) {최종 PrintWriter 아웃 = e.getValue(); 최종 소켓 s = e.getKey();'는 좀 더 효율적입니다. – assylias
Thx가이를 지적했습니다. – Kevin