I have a piece of code that needs to run inside a Swing application as well as in a webapplication. But it should do slightly different things in each environment. Therefore we check SwingUtilities.isEventDispatchThread()
After working fine for some time this suddenly stopped working. It just hangs on that call and never returns. Any idea why that might be?
We are on java 6, tomcat 7 on a linux box.
UPDATE:
We removed the call to isEventDispatchThread() so my immediate problem is solved, but I’m still interested in an answer why this is happening.
We debugged a little more, got a Thread dump and found the stuff below for one thread.
It shows many threads are waiting on it. So that explains the hanging.
java.awt.Toolkit.getDefaultToolkit seems to causing the lock since it is synchronized. So Yura was hinting in the right direction.
So the question remains: Why doesn’t it complete or to turn the question around why does sun.awt.X11GraphicsEnvironment.initDisplay(X11GraphicsEnvironment.java:-1) hang?
There is a X11 running on the machine ….
"http-bio-8081-exec-10@10344" daemon prio=5 tid=0x1ae nid=NA runnable
java.lang.Thread.State: RUNNABLE
blocks http-bio-8081-exec-13@10809
blocks http-bio-8081-exec-12@10786
blocks http-bio-8081-exec-11@10343
blocks http-bio-8081-exec-9@10345
blocks http-bio-8081-exec-7@10346
blocks http-bio-8081-exec-6@10347
blocks http-bio-8081-exec-4@10349
blocks http-bio-8081-exec-3@10352
blocks http-bio-8081-exec-2@10353
blocks http-bio-8081-exec-1@10354
at sun.awt.X11GraphicsEnvironment.initDisplay(X11GraphicsEnvironment.java:-1)
at sun.awt.X11GraphicsEnvironment.access$100(X11GraphicsEnvironment.java:52)
at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:155)
at java.security.AccessController.doPrivileged(AccessController.java:-1)
at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:131)
at java.lang.Class.forName0(Class.java:-1)
at java.lang.Class.forName(Class.java:169)
at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:68)
- locked <0x2507> (a java.lang.Class)
at sun.awt.X11.XToolkit.<clinit>(XToolkit.java:89)
at java.lang.Class.forName0(Class.java:-1)
at java.lang.Class.forName(Class.java:169)
at java.awt.Toolkit$2.run(Toolkit.java:834)
at java.security.AccessController.doPrivileged(AccessController.java:-1)
at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:826)
- locked <0xf9d> (a java.lang.Class)
at java.awt.Toolkit.getEventQueue(Toolkit.java:1689)
at java.awt.EventQueue.isDispatchThread(EventQueue.java:857)
at javax.swing.SwingUtilities.isEventDispatchThread(SwingUtilities.java:1339)
at xxxxxxxxxA.setCurrentUser(xxxxxxxxxA.java:196)
at xxxxxxxxxB.setCurrentUser(xxxxxxxxxB.java:41)
at xxxxxxxxxC.UserThreadLocalHandler.afterCompletion(xxxxxxxxxC.java:96)
at org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletion(DispatcherServlet.java:1108)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:830)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:574)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(ShallowEtagHeaderFilter.java:58)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:162)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
- locked <0x2a42> (a org.apache.tomcat.util.net.SocketWrapper)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Under the hood,
SwingUtilities.isEventDispatchThread()invokesToolkit.getEventQueue()method, which has following source:Toolkit.getDefaultToolkitis declared assynchronizedmethod – maybe this is the case. Also, please refer to JavaDoc of this method:http://docs.oracle.com/javase/6/docs/api/java/awt/Toolkit.html#getDefaultToolkit%28%29
Hope this helps