2010-02-18 19 views
9

Quando un Thread.interrupt() viene chiamato su qualche thread, cosa succede a quel thread?Quando su alcuni thread viene chiamato Thread.interrupt(), cosa succede?

+1

Puoi essere più specifico? Mi sembra che la documentazione ne parli abbastanza bene: http://java.sun.com/javase/6/docs/api/java/lang/Thread.html # interrupt() Sto assumendo che ci sia qualcosa che non sta chiarendo, però, se puoi affinare la tua domanda? –

risposta

30

Il thread di destinazione è "interrotto". Per lo più, in quel thread viene impostato un flag, a cui il thread può guardare (con Thread.interrupted()). Se il thread di destinazione era attualmente bloccato su alcuni I/O o Object.wait(), viene risvegliato con, rispettivamente, uno InterruptedIOException o uno InterruptedException.

L'interruzione del filo è un modo delicato per spingere un filo. È usato per dare ai thread la possibilità di uscire cleanly, al contrario di Thread.stop(), che è più come sparare alla discussione con un fucile d'assalto.

+1

'InterruptedIOException' è improbabile è pratica. L'I/O interrompibile è stato abilitato in Solaris brevemente, ma non ne vale la pena. Ovviamente l'implementazione è specifica per l'implementazione. Tipicamente (negli ultimi tempi) il sistema operativo avrà qualcosa a che fare con i thread. –

+7

+1 per la spiegazione da soli e il confronto di shoting. – helios

2

Ecco JDK 1.6 Javadoc:

Interrupt questo thread.

meno che il thread corrente è stessa interruzione, che è sempre consentito, il metodo di CheckAccess questo filo è richiamato, che può causare una SecurityException essere gettato.

Se questa discussione è bloccato in una invocazione del wait(), attendere (lungo), o attendere (long, int) metodi della classe oggetto, o del join(), join (lungo), join (long, int), sleep (long), o sleep (long, int), metodi di questa classe, quindi il suo stato di interruzione verrà cancellato e riceverà un InterruptedException.

Se questa discussione è bloccato in una O operazione/I su un canale interrompibile il canale sarà chiuso, lo stato di interruzione del thread sarà impostato, e il thread riceverà un ClosedByInterruptException.

Se questa discussione è bloccato in un Selettore poi stato di interrupt del thread viene impostata e tornerà immediatamente dall'operazione selezione , eventualmente con uno zero non valore, come se il selettore sveglia metodo sono stati invocati.

Se nessuna delle condizioni precedenti è , allora verrà impostato lo stato dell'interrupt di questo thread .

L'interruzione di un thread che non è attivo non ha alcun effetto.

0

ZeissS è corretto, la segnalazione è il modo più pulito per farlo. puoi anche catturare l'eccezione di interrupt e pulire in questo modo.

Problemi correlati