views:

189

answers:

3

I understand what an InterruptedException does and why it is thrown. However in my application I get it when waiting for SwingUtilities.invokeAndWait() on a thread that is only known by my application, and my application never calls Thread.interrupt() on any thread, also it never passes the reference of the thread on to anyone.

So my question is: Who interrupts my thread?

Is there any way to tell? Is there a reason why the InterruptedException doesn't contain the name of the Thread that requests the interrupt?

I read that it could be a framework or library that does this, we use the following, but I can't think of reason for them to interrupt my thread:

  • Hibernate
  • Spring
  • Log4J
  • Mysql connector
+2  A: 

There is something strange here.

From the javadoc of invokeAndWait, an InterruptedException is thrown

if we're interrupted while waiting for the event dispatching thread to finish excecuting doRun.run()

Have you tried to see if the code executed in the EDT sends any exception ? Or do the code in that EDT tries to modify some of this thread's variables (I know this term is not "orthodox" in java language, but I hope you see what I mean : any code implying synchronized, wait, join, ...

Riduidel
If the Runnable we are waiting for throws an exception it should give an InvocationTargetException, which isn't the case. It is possible that our threads has a lock while waiting, could that cause it? I'm sure we don't have a deadlock. The thread we wait for creates a dialog that we use in the waiting thread.
Thirler
+3  A: 

In general, if you want to know who is doing something, attach a debugger, put a breakpoint, and there you go. No need for guessing if you can reproduce it!

In this case, you can put a breakpoint at Thread.interrupt(). If there are other threads that are being interrupted too (so you have "false positive" hits on the breakpoint), you could add a breakpoint condition (most IDE's allow you to do that easily), for example by checking the name of the thread.

Wouter Coekaerts
+2  A: 

If possible, you could extend Thread and overwrite the interrupt() method for this thread to print a stacktrace or throw an unsupported operation exception.

You could also use the extended Thread class to store a reference to the interrupting thread and read it once you catch the interrupted exception.

josefx