2010-03-19 7 views
12

Capisco cosa fa InterruptedException e perché viene generato. Tuttavia nella mia applicazione ho capito quando ho aspettato il SwingUtilities.invokeAndWait() su un thread conosciuto solo dalla mia applicazione, e la mia applicazione non chiama mai Thread.interrupt() su nessun thread, inoltre non passa mai il riferimento del thread a nessuno.Chi interrompe il mio thread?

Quindi la mia domanda è: chi interrompe il mio thread?

C'è un modo per dire? C'è un motivo per cui InterruptedException non contiene il nome della discussione che richiede l'interruzione?

Ho letto che potrebbe essere un quadro o una libreria che fa questo, si usa la seguente, ma non riesco a pensare a motivo per loro di interrompere la mia discussione:

  • Hibernate
  • Primavera
  • Log4J
  • connettore
  • Mysql
+8

Penso che tu intenda "Chi * DARES * interrompe il mio thread?" –

+2

+1 - Stai facendo # join in thread? genera InterruptedException. – RubyDubee

+0

Infatti Scott, preferirei che i miei thread non fossero interrompibili (perché non voglio comunque soddisfare la richiesta). Non facciamo il join di Thread #, ma posso immaginare che invokeAndWait usi un tale meccanismo. Tuttavia, Thead # join invoca un interrupt su un altro thread? Inoltre sono abbastanza sicuro che nessuno aspetti che il mio thread sia completato (come non lo sarà mai). – Thirler

risposta

11

Se possibile, è possibile estendere Thread e sovrascrivere il metodo interrupt() per questo thread per stampare uno stacktrace o generare un'eccezione operazione non supportata.

È anche possibile utilizzare la classe estesa Thread per memorizzare un riferimento al thread di interruzione e leggerlo una volta rilevata l'eccezione interrotta.

2

C'è qualcosa di strano qui.

Dal javadoc di invokeAndWait, un InterruptedException si butta

se stiamo interrotti durante l'attesa per l'evento di dispacciamento thread per finire excecuting doRun.run()

Hai provato a vedere se il codice eseguito nell'EDT invia qualche eccezione? Oppure il codice di EDT tenta di modificare alcune delle variabili di questo thread (so che questo termine non è "ortodosso" nel linguaggio java, ma spero che tu capisca cosa intendo: qualsiasi codice che implica sincronizzato, aspetta, unisciti, ...

+0

Se il Runnable che stiamo aspettando lancia un'eccezione dovrebbe dare una InvocationTargetException, che non è il caso. È possibile che i nostri thread abbiano un lucchetto in attesa, potrebbe causarlo? Sono sicuro che non abbiamo una situazione di stallo. Il thread che aspettiamo crea una finestra di dialogo che usiamo nel thread in attesa. – Thirler

4

In generale, se si vuole sapere chi sta facendo qualcosa, collegare un debugger, mettere un punto di interruzione, e ci si va. non c'è bisogno di indovinare se è possibile riprodurlo!

In questo caso, è possibile inserire un punto di interruzione su Thread.interrupt(). Se ci sono altri thread che vengono interrotti (quindi si hanno risultati "falsi positivi" sul punto di interruzione), è possibile aggiungere una condizione di punto di interruzione (la maggior parte degli IDE consente di farlo facilmente), ad esempio da controllare il nome della discussione