2013-03-20 17 views
10
  1. Perché un thread di sospensione richiede un tentativo di cattura per rilevare l'eccezione interrotta?
  2. Perché un sonno emette anche un errore di eccezione interrotta? Queste sono le due domande che voglio davvero scoprire nella programmazione Java Ho cercato su google e non ho ancora trovato una spiegazione chiara sul perché queste due cose accadano.

risposta

1

1.- Poiché un thread non può completare la sua normale esecuzione se lo interrompe e devi prenderlo per essere pronto a fare qualcosa. 2.- Poiché un thread in attesa è diverso da un thread interrotto, è possibile riprendere un thread in attesa, ma un thread interrotto ha già terminato l'esecuzione.

+0

Dichiarando un'eccezione interrotta, posso fare liberamente clic sui pulsanti che ho immesso mentre le cose che ho messo a dormire stanno dormendo? Perché questo è quello che ho capito finora –

+0

controlla questo http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#interrupt%28%29 – jsedano

3

Un InterruptedException viene generata quando il filo è bloccato/attesa ed è interrotta da un altro thread (mediante Thread.interrupt). Consideralo come una richiesta di risoluzione immediata, che non soffre degli inconvenienti di Thread.stop().

In questo modo, anche se si ordina a un thread di dormire per diversi anni, è possibile interrompere tale thread.

The recommended practice interrompe tutto ciò che si sta elaborando quando viene emesso uno InterruptedException.

+0

Oh, ad esempio, ho due frame, frame1 e frame2. Frame1 ha un pulsante che mostra il frame 2. Dichiarando un'eccezione interrotta, posso fare clic su quel pulsante per mostrare il mio frame2 mentre frame1 sta dormendo? –

+0

Siamo spiacenti, non ho abbastanza esperienza con la concorrenza in AWT/Swing. Uso i thread per le attività in background. Se puoi riformulare la tua domanda senza usare la GUI, sarei felice di rispondere. – Javier

+0

La cosa divertente è che mi sono interessato a java per il suo gui e ho studiato solo per una settimana e penso che sia stata una pessima idea iniziare da quando devo prima conoscere le basi (tutto ciò che non è collegato alla gui). Anche se spero che questo sia un buon esempio, dormirò in una dichiarazione che aggiunge due numeri e l'unica cosa che ho notato riguardo al sonno è che "congela" il programma yung o succede solo in gui? (mi dispiace davvero non lo so). E aggiungendo un'eccezione interrotta, sei libero di fare qualsiasi altra cosa che vuoi fare mentre la dichiarazione che ti ha ordinato di dormire sta dormendo? –

0

C'è un esempio pulito di come l'eccezione interrotta può essere gettato qui: http://www.javamex.com/tutorials/threads/thread_interruption.shtml

E una discutere su sleep() e yield() qui: http://www.coderanch.com/t/508657/threads/java/Sleep-Yield-state

+0

È possibile accedere al thread dall'esterno in modo simultaneo mentre è in funzione o addormentato (questo è tutto il divertimento!): Quindi può essere chiesto di uscire "male", ecco perché viene sollevata l'eccezione. – Benj

+0

Oh, è come se fossi chiuso in una stanza con un ragazzo addormentato, aggiungendo un'eccezione interrotta, puoi sbloccare la stanza e fare altre cose "o" avere un secchio d'acqua in mano e "svegliare" il ragazzo fermandosi per dormire? Scusa se faccio situazioni di vita reale da applicare a questi problemi per aiutarmi a capirli meglio. –

+0

Che storia, ma * approssimativamente * è così;) – Benj

0

È perché sleep() potrebbe potenzialmente bloccare per sempre/lungo tempo così hai bisogno di un modo per essere in grado di cancellare questo comportamento. Poiché non è un completamento "normale" quando si interrompe l'azione, potrebbe essere necessario eseguire alcune azioni compensative o correttive specifiche, ad esempio, per inviare un avviso che non si è mai ricevuto una notifica, pulire risorse, ecc.
C'è un bel buono developer works article on the subject.

+0

Quindi aggiungendo un'eccezione interrotta, posso chiudere liberamente il mio programma mentre dorme o fare qualcos'altro mentre dorme? –

+0

Più come se si desidera chiudere l'applicazione, il thread in sospeso viene interrotto e ha la possibilità di svuotare il business prima di spegnersi, ad es. Scrivere in un db, registrare un messaggio. – James

1

Quando si chiede a un thread di dormire, il comportamento previsto per quella discussione è di dormire per tutto questo tempo. Quindi, se il sonno viene interrotto, genera InterruptedException per indicare che non è stato possibile completare l'attività. E potresti voler occuparti di cosa dovrebbe essere fatto se è interrotto.

+0

Se metto un'eccezione interrotta tramite catch try, thread sleep non "congela" il mio programma mentre fa il suo sleep? e sono in grado di svolgere altre attività come fare clic sui pulsanti del mio programma mentre la dichiarazione che ho messo a dormire sta dormendo? –

+0

Ogni volta che si fa clic su un pulsante, verrà creato un nuovo thread e chiamerà il metodo actionPerformed con un ActionEvent come argomento. –

+0

Dove esattamente hai messo il metodo sleep()? –

0

Il sonno e gli interrupt non sono correlati semanticamente. È solo che i progettisti Java pensavano che quando si desidera interrompere il thread, è una buona opportunità per ricordarsi di interrupt. Questo è come Duke dicendo "Sembra che tu stia cercando di dormire, vorresti anche rendere il tuo thread un buon cittadino assicurandoti che risponda correttamente agli eventi di interruzione, quando c'è bisogno di un modo per farlo terminare bruscamente in una fase successiva del tuo progetto sorge? "

Così uno sarà spesso vedere il codice come questo:

try { 
    Thread.sleep(1000); 
} catch (InterruptedException ie) { 
    //Don't worry about it. 
} 

A volte le persone dicono che questo è considerato una cattiva pratica. Ma se non hai intenzione di utilizzare la funzione di interrupt nel tuo programma, allora queste eccezioni non verranno mai lanciate, quindi devi chiederti se stai facendo il lavoro extra per occuparti di queste eccezioni, nel caso decidessi di aggiungere la funzione di interrompibilità del tuo programma qualche tempo dopo, ha senso.Questa è una di quelle cose che i progettisti Java hanno insistito sul fatto che ogni thread dovrebbe fare - che tu possa fare lo interrupt(), e abortire rapidamente e in modo pulito quello che sta facendo. Penso che non sia necessario in molti casi, ma le persone guarderanno il tuo codice, lo vedranno e diranno ancora "eew, cattive pratiche!"

The official Java tutorial explains interrupts. Fondamentalmente, se hai un thread t che esegue qualche elaborazione, e poi l'utente vuole cancellarlo, da un altro thread chiameresti t.interrupt(). Nel codice che è in esecuzione sul thread t, ogni volta che è sleep() s, o wait() s, ecc., Viene generato uno InterruptedException. Se non fa nulla di ciò, allora può (dovrebbe) anche scoprire se è stato interrotto usando di tanto in tanto Thread.interrupted(). In tutti questi modi di scoprire gli interrupt, dovrebbe abbandonare ciò che sta facendo e ripulire al più presto. (Vale a dire: se lo fa, allora questo comportamento potrebbe essere utile a te oa qualcuno - questa è l'idea degli interrupt.)

Quindi, Java rende questa un'eccezione controllata del metodo sleep(..), per costringerti a pensa di usare questa struttura. L'altra parte della motivazione è che sesleep(..) viene interrotto, quindi si sveglierà presto, e questo è un evento eccezionale. (Ma ricorda, c'è quello "se".)

L'importante è che gli interrupt non avvengano semplicemente senza motivo. Accadono se scrivete del codice per farli accadere, o se qualcun altro lo fa, chi lancia i vostri thread e ha bisogno di cancellare le loro attività. Quindi questo è chi causa Thread.sleep(..) di lanciare un InterruptedException. Tu fai. E se non lo fai, allora hai ancora bisogno di prenderlo.


Modifica. Tra l'altro, sarebbe una pratica migliore per farlo in questo modo:

try { 
    Thread.sleep(1000); 
} catch (InterruptedException ie) { 
    throw new UnsupportedOperationException("Interrupts not supported.", ie); 
} 

Quindi, se, o qualcun altro, mai cerca di interrompere questa discussione per errore in seguito, poi quando vanno a testarlo , verrà ricordato che questa funzione non è implementata. (UnsupportedOperationException è una sottoclasse di RuntimeException, quindi è deselezionata.)