2012-02-08 7 views
1

다음과 같은 방법으로 스레드가 중단되어 다른 스레드가 중단되어 스택이 생성되어 응용 프로그램 서버가 중단 될 수 있습니다. 당신의 도움이스레드가 멈춰서 다른 스레드가 멈추는 경우


에 대한

private static Hashtable content = new Hashtable(); 
private static int cleanout; 

private static void cleanoutCache() { 

    if(cleanout > 50000) { 

     synchronized(PollCacheManager.class) { 

      Enumeration emu = content.keys(); 

      while(emu.hasMoreElements()) { 

       String key = (String)emu.nextElement(); 

       PollCacheStore bean = (PollCacheStore)content.get(key); 

       if((System.currentTimeMillis() - bean.getLastInitialized()) > 86400000) { 

        content.remove(key); 

       } 

      } 

      // reset cleanout 
      cleanout = 0; 

     } 

    } 

} 

덕분에 나는 my previous question에 앞서 언급 한 문제를 시뮬레이션 내 테스트 케이스를 실행할 때 생성 된 스레드 덤프의 스냅 샷을 붙여했습니다.

모든 "Servlet.Engine.Transports"스레드는 내 응용 프로그램과 관련된 스레드입니다. 모두 모니터에서 기다리고있는 것 같습니다. 그러나 그들이 어떤 자원을 기다리고 있는지에 대한 자세한 내용은 제공되지 않았습니다. 이 스레드 덤프를 분석 할 때 조금 새로운 점이 있습니다. 교착 상태와 같지 않고 경쟁 조건이 아니라 자원 경쟁이 아닌 것처럼 보입니다. 그러나 내 하중 테스트 도구 결과 프로세스 걸기가 분명했습니다. 당신의 도움을 주셔서 감사합니다

전체 스레드 덤프 :

"Thread-1727" prio=5 tid=0x2aea620 nid=0x9a2 waiting on monitor [0xb6481000..0xb6481a00] 
    at java.lang.Thread.sleep(Native Method) 
    at com.ibm.websphere.personalization.util.timer.PznTimerEvents.run(PznTimerEvents.java:222) 
    at java.lang.Thread.run(Thread.java:479) 

"Thread-1683" daemon prio=5 tid=0x1a21668 nid=0x973 runnable [0xb4581000..0xb4581a00] 
    at java.net.SocketInputStream.socketRead(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:85) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:181) 
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:220) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:275) 
    at com.sun.jndi.ldap.Connection.run(Connection.java:581) 
    at java.lang.Thread.run(Thread.java:479) 

"Thread-1682" daemon prio=5 tid=0x4ed830 nid=0x972 runnable [0xb5301000..0xb5301a00] 
    at java.net.SocketInputStream.socketRead(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:85) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:181) 
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:220) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:275) 
    at com.sun.jndi.ldap.Connection.run(Connection.java:581) 
    at java.lang.Thread.run(Thread.java:479) 

"Thread-1681" daemon prio=5 tid=0x1ec1a20 nid=0x971 runnable [0xb5401000..0xb5401a00] 
    at java.net.SocketInputStream.socketRead(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:85) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:181) 
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:220) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:275) 
    at com.sun.jndi.ldap.Connection.run(Connection.java:581) 
    at java.lang.Thread.run(Thread.java:479) 

"Servlet.Engine.Transports : 387" daemon prio=5 tid=0x15386f8 nid=0x943 waiting on monitor [0xb4781000..0xb4781a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"Servlet.Engine.Transports : 385" daemon prio=5 tid=0x51e898 nid=0x93e waiting on monitor [0xb3281000..0xb3281a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"Servlet.Engine.Transports : 384" daemon prio=5 tid=0x464760 nid=0x93d waiting on monitor [0xb3381000..0xb3381a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"Servlet.Engine.Transports : 382" daemon prio=5 tid=0x1141de8 nid=0x8a0 waiting on monitor [0xb3581000..0xb3581a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"Servlet.Engine.Transports : 380" daemon prio=5 tid=0x1151ad8 nid=0x6b5 waiting on monitor [0xb3e81000..0xb3e81a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"Servlet.Engine.Transports : 366" daemon prio=5 tid=0x1a1d110 nid=0x3fb waiting on monitor [0xb4b81000..0xb4b81a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"Servlet.Engine.Transports : 365" daemon prio=5 tid=0x4e8bd8 nid=0x3fa waiting on monitor [0xb6281000..0xb6281a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"Servlet.Engine.Transports : 362" daemon prio=5 tid=0x17055b0 nid=0x3f7 waiting on monitor [0xb3481000..0xb3481a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"Servlet.Engine.Transports : 356" daemon prio=5 tid=0x1ddbae0 nid=0x3f1 waiting on monitor [0xb9c01000..0xb9c01a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"Servlet.Engine.Transports : 299" daemon prio=5 tid=0x2519028 nid=0x3b5 waiting on monitor [0xb6001000..0xb6001a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"SoapConnectorThreadPool : 3" daemon prio=5 tid=0x15d49f0 nid=0x1ae waiting on monitor [0xb2e81000..0xb2e81a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"Alarm : 3" daemon prio=5 tid=0x1d24c48 nid=0xa5 waiting on monitor [0xb6381000..0xb6381a00] 
    at java.lang.Object.wait(Native Method) 
    at com.ibm.ws.util.BoundedBuffer.poll(BoundedBuffer.java:192) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"Keep-Alive-Timer:" daemon prio=8 tid=0x1ec9a38 nid=0x99 waiting on monitor [0xb3f81000..0xb3f81a00] 
    at java.lang.Thread.sleep(Native Method) 
    at sun.net.www.http.KeepAliveCache.run(KeepAliveCache.java:130) 
    at java.lang.Thread.run(Thread.java:479) 

"Thread-64" daemon prio=5 tid=0x4ee700 nid=0x98 waiting on monitor [0xb4081000..0xb4081a00] 
    at java.lang.Thread.sleep(Native Method) 
    at com.ibm.ejs.j2c.poolmanager.TaskTimer.run(TaskTimer.java:119) 

"RT=7:P=908030:O=0:WSTCPTransportConnection[addr=10.24.189.74,port=47148,local=9812]" daemon prio=5 tid=0x4c73f8 nid=0x97 runnable [0xb4181000..0xb4181a00] 
    at java.net.SocketInputStream.socketRead(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:85) 
    at com.ibm.rmi.iiop.Connection.readMoreData(Connection.java:909) 
    at com.ibm.rmi.iiop.Connection.createInputStream(Connection.java:742) 
    at com.ibm.rmi.iiop.Connection.doReaderWorkOnce(Connection.java:2447) 
    at com.ibm.rmi.transport.ReaderThread.run(ReaderPoolImpl.java:138) 

"RT=6:P=908030:O=0:WSTCPTransportConnection[addr=10.24.189.74,port=9812,local=47148]" daemon prio=5 tid=0x3b7860 nid=0x96 runnable [0xb4281000..0xb4281a00] 
    at java.net.SocketInputStream.socketRead(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:85) 
    at com.ibm.rmi.iiop.Connection.readMoreData(Connection.java:909) 
    at com.ibm.rmi.iiop.Connection.createInputStream(Connection.java:742) 
    at com.ibm.rmi.iiop.Connection.doReaderWorkOnce(Connection.java:2447) 
    at com.ibm.rmi.transport.ReaderThread.run(ReaderPoolImpl.java:138) 

"Thread-63" daemon prio=5 tid=0x1666990 nid=0x91 waiting on monitor [0xb4681000..0xb4681a00] 
    at java.lang.Thread.sleep(Native Method) 
    at com.ibm.ws.management.RoutingTable$PingThread.run(RoutingTable.java:1025) 

"ProcessDiscovery : 0" daemon prio=5 tid=0x1c7b4c8 nid=0x8b waiting on monitor [0xb4881000..0xb4881a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"SoapConnectorThreadPool : 2" daemon prio=5 tid=0x1b82798 nid=0x8a waiting on monitor [0xb4981000..0xb4981a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"SoapConnectorThreadPool : 1" daemon prio=5 tid=0x1505188 nid=0x89 waiting on monitor [0xb4a81000..0xb4a81a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"ORB.thread.pool : 1" daemon prio=5 tid=0x24cfd20 nid=0x83 waiting on monitor [0xb4c81000..0xb4c81a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"ORB.thread.pool : 0" daemon prio=5 tid=0x15025c0 nid=0x82 waiting on monitor [0xb4d81000..0xb4d81a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161) 
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669) 

"RT=5:P=908030:O=0:WSSSLTransportConnection[addr=10.25.168.38,port=33762,local=46854]" daemon prio=5 tid=0x1520f20 nid=0x81 runnable [0xb4e81000..0xb4e81a00] 
    at java.net.SocketInputStream.socketRead(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:85) 
    at com.ibm.sslite.t.a(Unknown Source) 
    at com.ibm.sslite.t.b(Unknown Source) 
    at com.ibm.sslite.t.a(Unknown Source) 
    at com.ibm.sslite.a.read(Unknown Source) 
    at com.ibm.jsse.a.read(Unknown Source) 
    at com.ibm.rmi.iiop.Connection.readMoreData(Connection.java:909) 
    at com.ibm.rmi.iiop.Connection.createInputStream(Connection.java:742) 
    at com.ibm.rmi.iiop.Connection.doReaderWorkOnce(Connection.java:2447) 
    at com.ibm.rmi.transport.ReaderThread.run(ReaderPoolImpl.java:138) 

"Thread-53" prio=5 tid=0x29558 nid=0x1 waiting on monitor [0..0xffbedb10] 

"[email protected]" prio=5 tid=0x17dacf8 nid=0x80 runnable [0xb4f81000..0xb4f81a00] 
    at java.net.PlainDatagramSocketImpl.receive(Native Method) 
    at java.net.DatagramSocket.receive(DatagramSocket.java:387) 
    at com.ibm.ws.management.discovery.transport.MulticastServer.run(MulticastServer.java:196) 
    at java.lang.Thread.run(Thread.java:479) 

"ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=9044]" prio=5 tid=0x157f330 nid=0x7f runnable [0xb5981000..0xb5981a00] 
    at java.net.PlainSocketImpl.socketAccept(Native Method) 
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:463) 
    at java.net.ServerSocket.implAccept(ServerSocket.java:238) 
    at java.net.ServerSocket.accept(ServerSocket.java:217) 
    at com.ibm.jsse.bg.accept(Unknown Source) 
    at com.ibm.ws.http.HttpTransport.run(HttpTransport.java:235) 
    at java.lang.Thread.run(Thread.java:479) 

"ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=9091]" prio=5 tid=0x15d10c0 nid=0x7e runnable [0xb5a81000..0xb5a81a00] 
    at java.net.PlainSocketImpl.socketAccept(Native Method) 
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:463) 
    at java.net.ServerSocket.implAccept(ServerSocket.java:238) 
    at java.net.ServerSocket.accept(ServerSocket.java:217) 
    at com.ibm.ws.http.HttpTransport.run(HttpTransport.java:235) 
    at java.lang.Thread.run(Thread.java:479) 

"ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=9444]" prio=5 tid=0x1693c28 nid=0x7d runnable [0xb5b81000..0xb5b81a00] 
    at java.net.PlainSocketImpl.socketAccept(Native Method) 
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:463) 
    at java.net.ServerSocket.implAccept(ServerSocket.java:238) 
    at java.net.ServerSocket.accept(ServerSocket.java:217) 
    at com.ibm.jsse.bg.accept(Unknown Source) 
    at com.ibm.ws.http.HttpTransport.run(HttpTransport.java:235) 
    at java.lang.Thread.run(Thread.java:479) 

"ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=9081]" prio=5 tid=0x24d2f78 nid=0x7c runnable [0xb5e01000..0xb5e01a00] 
    at java.net.PlainSocketImpl.socketAccept(Native Method) 
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:463) 
    at java.net.ServerSocket.implAccept(ServerSocket.java:238) 
    at java.net.ServerSocket.accept(ServerSocket.java:217) 
    at com.ibm.ws.http.HttpTransport.run(HttpTransport.java:235) 
    at java.lang.Thread.run(Thread.java:479) 

"Dispatcher-Thread-52" daemon prio=1 tid=0x509da0 nid=0x7b waiting on monitor [0xb5f01000..0xb5f01a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at org.apache.log4j.Dispatcher.run(AsyncAppender.java:293) 

"Thread-51" prio=5 tid=0x254138 nid=0x7a waiting on monitor [0xb5c81000..0xb5c81a00] 
    at java.lang.Thread.sleep(Native Method) 
    at com.ibm.wcm.jobs.Scheduler.run(Scheduler.java:68) 
    at java.lang.Thread.run(Thread.java:479) 

"wcp_1328597020006" prio=5 tid=0x2a5c628 nid=0x76 waiting on monitor [0xb6101000..0xb6101a00] 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:415) 
    at com.ibm.wcp.analysis.util.MultiAccessQueue.dequeue(MultiAccessQueue.java:223) 
    at com.ibm.wcp.analysis.event.ListenerThread.run(ListenerThread.java:87) 

..... 더 (때문에 여기에 문자 제한에)

+0

짧은 대답 : 아니오. 더 긴 대답 :이 코드에는 많은 문제가 있습니다. EhCache와 같은 사전 빌드 된 (잘 테스트 된) 캐시를 사용하는 것이 좋습니다. – kdgregory

+0

@ user1096804 WebSphere Threadpool의 세부 사항을 모르면 "Servlet.Engine.Transports"스레드가 수신 작업을 기다리고 있다고 말할 수 있습니다. – afrischke

답변

1

동기화 된 블록 내에서 "50000보다 큰 클린 아웃"테스트를 이동하여 모든 스레드가 메서드의 끝에서 수정 된 해당 값의 최신 버전을 확인하도록해야합니다.

"content"및 "cleanout"변수에 대한 다른 모든 액세스가 "PollCacheManager.class"모니터 (포함 된 읽기)로도 보호되는 경우 나머지는 정상적으로 보입니다.

+0

즉시 업데이트 해 주셔서 감사합니다. 이와 같은 조치가 어떻게 문제를 일으키는 지 조금 더 설명해 주실 수 있습니까? 나는 "50000 이상 클린 아웃"이 원인 일 수 있다는 비슷한 생각을 가지고 있었지만, 나는 그것을 스스로 증명할 수 없다. 나는 동기화 된 블록이 어떻게 작동하는지 이해하지 못하기 때문에 그것을 추측 할 수있다. 도움을 주셔서 감사합니다 – dale

+0

스레드간에 공유되는 모든 데이터는 한 방향으로 동기화되거나 다른 방식으로 동기화되어야합니다 (동기화 된 키워드 또는 java.util.concurrent의 잠금 또는 스레드 안전 구조 사용). 여기서 "정리"속성은 동기화없이 읽혀집니다 (테스트에서). 이로 인해 스레드가 업데이트 된 값을받지 못할 수 있습니다 (메서드의 끝에 0으로 설정). 또한, 나는이 값이이 방법으로 증가하지 않는다는 것을 알기 때문에, 다른 곳에서도 그 값을 추측 할 수 있습니다. 위 코드에서와 같은 모니터를 사용하여 동기화 블록에서도 완료되었는지 확인하십시오. –

+0

이 모든 동기화 작업이 어떻게 작동하는지에 대한 좋은 설명이 필요하면 SCJP 시험 준비 도서 (아마존에서 "SCJP 6"으로 검색)를 살펴보십시오. 이 책은 Java 학습에 매우 유용합니다. –

0

나는 모든 기능을 제공, 동기화이 동기화를 사용하고 만들 것 , 왜 당신이 Hashtable (또한 동기화됩니다)를 사용하는 것이 궁금해?

이 해시 테이블에 대한 다른 액세스가 동일한 잠금에 의해 보호되지 않기 때문에 약간의 경쟁 조건이 발생할 수 있습니까?

+0

감사합니다 님,이 상황으로 인해 동기화 블록 내에서 해시 테이블 작업이 주어진 스레드가 중단 될 수 있습니까? 이로 인해 교착 상태가 발생할 수 있습니까? 이 경우에 해시 테이블을 사용하면 어떻게 막힌 스레드가 생깁니 까?감사합니다 – dale

+0

@ user1096804, 확실하지, 그냥 가설, 나는 스레드 덤프 할 것이고 그들이 모두 붙어 있는지 볼 수 있습니다. 가장 빠른 방법입니다. – Nim

1

질문에 제시된 코드는 병목 현상 (정적 필드/클래스 개체와의 동기화)을 나타낼 수 있지만 실행중인 스레드가 실행될 것으로 가정 할 수있는 한 생체 문제에 대해서는 책임을지지 않습니다. 합리적인 시간 내에 Hashtable의 키를 반복 할 수 있어야합니다. 외부 코드가 PollCacheManager 클래스 객체에 대한 잠금을 획득하고, 따라서 indefinitively 실행중인 스레드 (자세한 내용은 this page 참조) 연기 하듯는 PollCacheManager IFF PollCacheManager의 클래스 객체에 동기화 다소 위험하다 그러나

참고 공개적으로 액세스 할 수 .

응용 프로그램이 중단되는 경우 가장 좋은 방법은 스레드 덤프를 트리거하는 것입니다 (JVM에 SIGQUIT (Unix에서는 kill -3), Windows에서는 Ctrl-Break) 만 보내고 스택 추적을 분석하는 것이 가장 좋습니다.

관련 문제