Jens Schauder
Jens Schauder

Reputation: 81990

Why does a webapp hang on SwingUtilities.isEventDispatchThread()

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)

Upvotes: 1

Views: 819

Answers (1)

Yuriy Nakonechnyy
Yuriy Nakonechnyy

Reputation: 3842

Under the hood, SwingUtilities.isEventDispatchThread() invokes Toolkit.getEventQueue() method, which has following source:

/* Accessor method for use by AWT package routines. */
static EventQueue getEventQueue() {
    return getDefaultToolkit().getSystemEventQueueImpl();
}

Toolkit.getDefaultToolkit is declared as synchronized method - 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

Upvotes: 1

Related Questions