Salve, questo è un po 'un po' nano secondo sguardo all'interruzione del thread che
è anche legato alla cooperazione.
Quindi, per le minacce che guardiamo indietro le scorte perché corrono fino al completamento, ma
a volte vorremmo interrompere una determinata attività o una discussione prima del completamento, ad esempio nel nostro programma di indicizzazione.
Se una pagina impiega troppo tempo per il download, potremmo voler interrompere quel particolare thread.
Si può ricordare da una delle nostre demo precedenti che uno dei thread del downloader è stato
bloccato in quanto non è stato possibile scaricare la pagina a causa di qualche problema sul server Web
e abbiamo dovuto interrompere manualmente il programma anziché arrestarlo esplicitamente.
Allo stesso modo, quando un utente esce da un pulsante di annullamento e dall'interfaccia utente, potrebbe essere necessario
arrestare il thread corrispondente.
Un altro motivo potrebbe essere che un'applicazione deve essere arrestata rapidamente a causa di motivi di prestazioni.
Quindi c'è stata una perdita di memoria e stiamo esaurendo la memoria che sta causando la lentezza
nel tempo di risposta dell'applicazione.
In questo caso, potremmo voler riavviare il server Web e nel processo interrompere qualsiasi thread in
background in esecuzione sul server.
Ad esempio, potremmo aver fatto qualche calcolo importante e potremmo volerlo fermare in modo
esplicito in modo che il trucco possa terminare in modo aggraziato anziché interromperli bruscamente durante
la competizione.
Il dollaro non fornisce un meccanismo per costringerlo a fermare la classe di camion che non ha il loro
nome per fermare forzatamente una minaccia, ma è stata duplicata insieme ad alcuni altri mandati come
sospendere e riprendere.
Puoi guardare le API delle classi per informazioni su questi metodi, quindi Dalma fornisce invece un'interruzione che
è un meccanismo aziendale per richiedere un thread per fermare la distruzione dell'acqua.
Quindi la prossima domanda sarebbe perché Java consente un meccanismo aziendale piuttosto che forzarlo a smettere di forzarlo a
interrompere immediatamente può lasciare qualsiasi oggetto condiviso in uno stato incoerente.
Quindi in modo cooperativo permetterebbe al thread di destinazione di eseguire qualsiasi operazione di pulizia prima del dominio.
OK, quindi era un'altra minaccia da porre fine in modo aggraziato.
Generalmente tali operazioni di pulizia vengono spesso ignorate, il che può portare a seri problemi.
Puoi richiamare questo esempio dalla nostra lezione sulle variabili volatili in cui abbiamo usato una variabile booleana
volatile e la interrompiamo.
Qui all'interno del main stiamo creando un nuovo thread con alcuni bleep e del testo
in un istante per tutto il ciclo while iterating One-Stop è impostato su true dal thread principale che viene
eseguito dopo circa 1 secondo e con quello i minuti di Treptow come corre al completamento.
Quindi questo è un modo per fermarlo correttamente.
Tuttavia questo potrebbe non essere applicabile in alcuni scenari.
Ad esempio, se un thread entra in stati come valutazione o valutazione temporizzata o blocco double in posizione
di metodi di blocco come vaid sleep o Giant, in realtà non sanno quando torneranno nello stato
di esecuzione.
Deselezionato il flag di stop per l'interruzione di tali scenari è la soluzione o non guardiamo all'interruzione.
Ogni thread ha lo stato di Boullion interrotto.
Solo i caratteri di default sotto la clausola della minaccia hanno questo metodo.
I chiamanti finivano sul lato libero di questo metodo su un thread di quanto lo stato di quel
thread sarebbe stato impostato e fondamentalmente è un segnale al thread per interrompere ciò che sta facendo a suo piacimento.
Cioè dipende dal thread su come si intreccia a questa richiesta non bloccando che è come dormire o
leggere provare a rilevare quando un thread è stato interrotto e il Kreiger ritorna.
Sostanzialmente rispondono cancellando l'interruzione del suo stato che sta ripristinando l'intero approccio ai
valori predefiniti.
Anche lanciando un'eccezione interrotta.
Si può ricordare che nelle nostre dimostrazioni il metodo di blocco allegato chiama come il sonno è grande
con Tricot con il codice di gestione delle eccezioni in un'eccezione intrepida.
Quindi, se lo stato è stato impostato su true sul metodo target, eseguito un metodo di blocco, genera un'eccezione
di interrupt dopo aver reimpostato il flag di stato.
Falso.
Allo stesso modo, anche se un thread è già in stati come la lettura o la scrittura o il
blocco risponderà reimpostando il flag di stato e lanciando l'eccezione che indica che è stata interrotta.
Il blocco catch che gestisce l'interrupt fa eccezione a qualsiasi ripulitura o semplicemente sa che
non vi è alcuna garanzia sulla velocità con cui un thread rileva un'interruzione, sebbene in pratica ciò avvenga
abbastanza velocemente.
Ora se il pod che il tuo programma prende non comporta un'operazione
di blocco allora potresti fare qualcosa del genere per terminare il ben condizionato invocare il
metodo IIS interrotto che è anche dalla terza classe e lo restituirebbe attraverso il prestigioso su ecco un supplente da interrompere ma
quello appena sostituito viene interrotto, che è anche un adulto di questo dagli Stati Uniti e questo.
Questo cancella lo stato interrotto e restituisce il valore precedente del flag di stato.
Se il metodo restituisce true, il ciclo non dominerebbe quell'interrupt che è l'unico metodo che può essere
utilizzato per reimpostare il flag di stato dell'interrupt.
Da notare infine che se si blocca a causa dell'uso di stream my walk allora quel particolare thread è ininterrotto ciò che
significa.
Come se il thread fosse in attesa di alcuni dati dalla sorgente, quel thread è ininterrotto su come le
directory stanno lavorando per questo e il problema è che dobbiamo chiudere il
flusso e ciò farebbe generare un'eccezione.
Ecco come eravamo nel thread.
Presto lo vedremo qui da qui.
Allo stesso modo, se una minaccia viene portata a un aspetto intrinseco che è o un metodo
sincronizzato o un blocco sincronizzato, ancora una volta la minaccia è ininterrotta c'è una vista alternativa che puoi usare
qualcosa chiamata blocchi espliciti e che è in attesa su di essi può essere interrotta con uno sguardo
blocchi espliciti per infine se un terzo bloccato a causa dell'uso di e cito piuttosto che il mio lavoro in streaming
allora quel thread è interrompibile.
Ora andiamo avanti e guardiamo all'interruzione in azione ok per questo momento.
Iniziamo guardando un esempio molto semplice di utilizzo del metodo di interrupt.
OK, quindi vedremo due programmi.
Il primo sarebbe un programma molto semplice sul secondo esempio sarebbe un po 'più complicato.
Quindi per il primo programma stiamo guardando lo stesso esempio che abbiamo visto in precedenza.
Si chiama My First Class, una delle prime classi che abbiamo portato qui in questa particolare
classe.
Tutto ciò che sta facendo è che il metodo principale è unbid nel metodo main che stiamo generando un nuovo thread
e che la variabile è chiamata esso stesso e che stiamo iniziando quella discussione in quel thread.
Tutto quello che stiamo facendo è che stiamo invocando la testa del parafango e altri carichi che vengono fatti invocando un
metodo chiamato più.
Ma non è rilevante qui per questa demo.
E il metodo principale sarebbe quindi dormire per tre secondi e stampare questo messaggio mi ha preso dentro.
Quindi quello che faremo è copiare questo codice, stiamo dormendo per tre secondi e faremo in modo
che l'altro thread dorma per circa nove secondi.
OK.
Quindi il principale sta dormendo per tre secondi.
L'altro thread sta cercando 9 secondi e quindi dal thread principale invocheremo il metodo di interrupt su questa
variabile in modo corretto, in modo tale che saremo così addormentati.
Il terzo è nello stato di sonno che è una sorta di stato di attesa e quando invochiamo l'accusa
che dovrebbe interrompere quella particolare data o la cronologia degli interrupt.
Quindi andiamo avanti e farlo.
Quindi fammi copiare questo e quello è inserito qui nella questione della corsa.
Facciamo questo nove.
Quindi nel blocco catch.
No, è per diffondere questa affermazione interrotta.
OK.
Ora passiamo al metodo principale.
Quindi, dopo aver dormito per tre secondi, percorriamolo.
Questo è il nome della variabile qui.
E matti nel metodo dell'interrupt.
E puoi anche vedere che l'altro dilettante ha interrotto un allentamento.
Ma questo è il problema medico nel mio libro su questo.
Quindi l'interprete ci porta a.
OK.
Quindi andiamo avanti e gestiamo questo.
Quindi, come puoi vedere dopo circa tre secondi, il thread principale sta invocando questo interrupt.
E il secondo thread è stato interrotto.
OK, quindi stiamo stampando il messaggio interrotto.
Quindi questo è il metodo dell'interrupt.
Quindi questo è il primo programma.
Ora diamo un'occhiata a un altro programma qui.
Si chiama noi vate non combattere ma l'interruzione incompleta.
Quindi è fondamentalmente un'estensione del metodo degli indici di notifica di velocità che abbiamo visto in precedenza.
E B come.
Interruzione qui.
Quindi abbiamo incorporato l'interruzione ma la chiamo incompleta perché qui c'è qualche limite.
OK.
Per questo motivo lo chiamo incompleto.
E per risolvere il problema potremmo dover guardare le serrature esplicite che sono l'argomento della prossima lezione.
Ecco perché è chiamato come incompleto e più simile a quando possiamo anche avere un incarico in merito su
questo in cui puoi effettivamente correggerlo.
Ma lo guardi più tardi.
Per ora si chiama solo interruzione incompleta Ecevit.
Quindi andiamo avanti e vediamo quali cambiamenti sono stati fatti in questo programma che era in origine
indice di notifica vago o il programma stesso.
OK.
Sai, come discusso nella lezione, vogliamo interrompere quella discussione se impiega troppo tempo.
Non leggere una pagina se ricordi che era uno degli esempi di cui avevamo bisogno.
Perché vogliamo fermare una minaccia.
E se ricordi che non conosciamo quella traccia che è responsabile per il download
della pagina web e abbiamo anche la minaccia degli indicizzatori che è giusto indicizzare la pagina Web scaricata.
Quindi questo è il modo e il modo in cui il metodo principale che sta invocando questo metodo chiamato ask go.
E nel metodo, se ricordi che stavamo creando il thread del downloader, il thread dell'indicizzatore
e stavamo iterando attraverso tutti i link web e stavamo creando per ognuna delle cose che stiamo creando
queste due tracce.
Ora in aggiunta a ciò che stiamo facendo, come sapete, vogliamo archiviare queste tracce in modo che possiamo in
seguito richiamare l'interprete.
Quindi per la memorizzazione vogliamo archiviarli in una struttura dati.
Quindi abbiamo un idealista.
Così ho creato altre due liste.
Uno è qualificante per il downloader tribalista e l'altro è indicizzatore raddrizzato.
Quindi questi sono infiniti.
Fondamentalmente memorizzano solo i brani scaricati su tracce di un mixer che l'elenco memorizzerà sulle tracce del mixer
qui.
Inoltre, ognuna di queste due teste viene data in.
Stiamo solo dicendo di non collegare quell'ID dal thread del downloader che stiamo dicendo di non
ordinare traccia con ID e stiamo semplicemente dando il nome del rebeling qui per far funzionare Heideggerian per ottenere il metodo ID.
Questo sarebbe il nome della traccia donatrice e stiamo facendo lo stesso con il trattore indicizzatore.
Quindi quelle sono le due tracce.
Quindi, fai attenzione perché sai che molti dei miei amici sono morti.
Quindi, fai più attenzione qui.
OK, quindi tutto ciò che stiamo facendo è aggiungere queste tracce a qualche malattia e dopo un arrivederci OK stiamo
dormendo per un secondo e in un secondo ci aspettiamo che la traccia finisca il lavoro di download.
Ora se non scarica se una particolare traccia non su Rodden, dobbiamo interromperla su quel particolare pezzo
di codice come scritto qui.
Quindi stiamo iterando attraverso il downloader provato benedetto.
Va bene.
E poi ci stiamo avvicinando a un thread e tu sai in una determinata iterazione che stiamo controllando se è vivo.
Quindi c'è questo è un limite e ritornerà VERO dopo che un lanciatore non ha ancora terminato il suo compito se non
è stato eseguito fino al completamento, quindi restituirà true.
Quindi in tal caso vogliamo interrompere questa minaccia.
Tuttavia, invece di interrompere la ciambella al terzo posto, si interromperà effettivamente la
lettura dell'intercetta corrispondente e questo in realtà interromperà l'interruzione dell'altro thread.
No, non conosco il terzo, sappiamo che non possiamo interromperlo perché sai che se ti
ricordi dalla lezione hai detto che se la minaccia utilizza il flusso la mia volontà è ininterrottabile e l'unico modo
in cui possiamo interromperlo è chiudendo il ruscello.
E questo è quello che sta succedendo qui perché stiamo usando lo streaming per scaricare la pagina.
E quindi non possiamo interromperlo a meno che non ci avviciniamo al flusso stesso.
Ecco cosa stiamo cercando di fare qui.
Così.
Quindi l'indice viene interrotto.
Ma per leggere abbiamo alcuni cambiamenti qui.
OK.
Così prima avevamo chiamato questo metodo chiamato hat d'Agde su Lord.
E stavamo passando a dove sei ora abbiamo bisogno di accedere al flusso di input.
OK, questo è il donatore che imita Non so che la minaccia e B hanno bisogno di accedere al flusso di input
in modo che possiamo effettivamente chiuderlo.
OK.
Ecco perché è stato scritto un nuovo metodo.
Cardus riceve il flusso di input nella cronologia e questo è già disponibile nella sezione delle risorse.
Quindi il flusso di input è qui e quindi abbiamo bisogno di chiudere il flusso di input e per questo abbiamo bisogno di usare
un thread diverso.
Ok, quindi dobbiamo generare un nuovo thread.
Quindi all'interno di questo thread non omicidio otteniamo quello che stiamo facendo è qui stiamo creando un nuovo thread.
OK.
E questo è principalmente responsabile della chiusura del flusso di input.
Quindi stai spendendo nel tuo thread qui.
Unidas e lo chiamiamo come B. G. filo.
OK perché è un thread bagong non obbligatorio e importa che vogliamo chiudere quel particolare flusso di input in base ad
alcune condizioni.
OK, quindi abbiamo una politica di cancellazione qui e la politica è quella dopo circa 1 secondo in questo particolare thread
se non termina l'attività che abbiamo bisogno di un più vicino.
Quindi questa è la politica.
Ora, dopo ancora una volta, dobbiamo sapere in qualche modo di creare questo thread se è ancora in corso il download
non è ancora completo, quindi la minaccia dovrebbe terminare e durante il processo deve richiamare il metodo close sul
flusso di input del flusso di input è fondamentalmente.
E così da quello.
OK, abbiamo anche introdotto una nuova variabile all'interno dell'oggetto inghiottito.
Puoi andare qui.
OK, eccolo qui.
Quindi è praticamente quello che succede quando ti fermi su una griglia.
Se impostiamo lo stop su due significa che il thread in background non sa che il thread deve essere fermato.
OK.
E ciò avviene chiudendo il flusso di input.
Quindi questo è un segnale per quel thread stop.
Quindi questa è l'intenzione principale qui.
OK.
Ora se l'E-Stop se restituisce false, allora che cosa.
Che cosa fa questo thread di Granter è solo un salto per un secondo e poi si sveglia e ancora
una volta a ogni ticchettio.
Ora se questa variabile è impostata su true, verrà impostata su true.
Quindi mostrerebbe questo aspetto e chiuderebbe la stringa di input.
Ora andiamo avanti in questa materia.
Quindi questa è ancora la classe di ordine e qui abbiamo la questione del download.
Così prima avevamo sentito la materia che stava prendendo un pedaggio da una pagina, ma ora sta prendendo un flusso di input.
Quindi è un motore sovraccarico.
E così abbiamo ottenuto e una volta o non ce ne accorgiamo, per cercare la pagina Yamal attaccata qui.
OK ora se quel proprietario completa in un modo normale.
Ma in tal caso, in quel caso, vogliamo interrompere la B. G. minaccia giusta
Altrimenti questo thread BT sarebbe ancora in esecuzione in background e vogliamo chiuderlo.
E questo non è solo non notificare tutto ciò che conta e il downloader.
E abbiamo anche come l'indice Armathwaite si guadagna il collo, quindi stiamo anche aspettando qui.
OK quindi alla fine Metzer motard ora abbiamo questo blocco catch che interrompe tutte quell'eccezione
perché se si richiama se qui nel terzo obiettivo stiamo effettivamente invocando il metodo dell'interrupt sul downloader.
Il terzo è vivo.
OK dopo un secondo, stiamo invocando il metodo di interrupt sull'interrupt che non lo stiamo facendo su non
lo so.
Giusto ma l'interruzione che non si trova nell'interruzione fa male perché interrompono e scaricano terzo sono connessi.
Destra.
Stanno cooperando arroccati sulla fine del terzo sarà effettivamente interrotto.
E se viene interrotto, questo è il blocco catch del thread interrotto e all'interno del blocco catch stiamo facendo
qualche operazione di cleanup e l'operazione di cleanup non è altro che altro che impostare questo stato
di stop per la troupe.
E se si imposta lo stato per equipaggio giù nel thread del downloader abbiamo il thread in background su quello.
Controlleremo lo stato se il flag stop è vero e chiuderà il flusso di input e non appena
chiude il flusso di input.
Quindi il principale Quindi il download in seguito, che è in realtà nella questione del download.
OK.
Sta aspettando lì i dati che genereranno un'eccezione e l'eccezione è qui e stiamo stampando questo messaggio dicendo
che la pagina non può essere scaricata.
OK.
E così stiamo dominando il flusso, le ragazze che guardano sono indirettamente interrotte.
Quindi questo è quello ora.
Quindi penso che possiamo andare avanti e gestirlo con questo metodo.
Quindi abbiamo finito con quello.
Quindi diamo un'occhiata a questo qui.
Quindi l'altro thread sta provando a scaricare queste pagine e una delle pagine è in realtà completata
fino al 2003 ed è stata indicizzata anche OK.
Quindi il B. G. filo perché anche dopo il B. G. thread è anche interrotto
perché anche se siamo quando abbiamo finito di scaricare la pagina, stiamo ancora chiamando dopo averlo scaricato con successo.
Siamo ancora in Wilkin il metodo dell'interrupt perché vogliamo anche che questo thread sia terminato.
OK, non abbiamo più bisogno di questo, quindi possiamo terminarlo anche dopo aver scaricato con successo la pagina web
entro un secondo.
Quindi qui stiamo dicendo che il tempo è scaduto, il che significa che un secondo è passato, ci
sono alcune tracce che sai che sono ancora acto.
Quindi, ciò significa che questi tre sono 2000 2001 e 2002, quindi in realtà qui sai che non potevano
nemmeno entrare nell'indice o nel thread che stanno aspettando qui sul blocco sincronizzato che è un blocco
intrinseco.
E anche se l'interesse è stato invocato Sappiamo che nella conferenza, se ricordate, abbiamo detto
che qualsiasi thread in attesa su un blocco intrinseco che sarebbe un orologio sincronizzato e che è lì
sarebbe stato ininterrotto.
OK.
Ci sarebbe ancora qui ad aspettare nel senso bloccato dichiarato.
OK.
Quello ininterrotto.
Quindi ci sono 330 che sono tre indicizzatori che stanno aspettando qui, ma ci sono interpreti corrispondenti che
hanno già lavorato.
Ma stiamo ancora aspettando qui.
Quindi questo è il limite di questo approccio.
Ben bene operativo qui.
Quindi, anche dopo che sono lì, le tracce dei downloader continuano ancora sono questi tre thread
e stiamo vedendo che Pluto è su $ 1 come completo e poi viene interrotto e
quindi è indicizzato qui perché di Warga lo notificherà in seguito uscirebbe.
So che sì, perché era sulla pagina e qui nella lettura inesperta dei rapporti che stiamo avendo questa condizione
vile.
OK.
E se la testa di malapit non è uguale a null e quindi B stai indicizzando questa pagina
in modo che, anche se il tempo è passato, è trascorso un secondo.
Siamo ancora su tutte e tre le pagine qui.
OK, questo è il problema
Questo perché tutto il trattamento è ciò che in realtà sta aspettando qui, è un OK, quindi questa è la seconda limitazione che
non ha alcun effetto qui.
Lasciami correre ancora una volta.
Sai che questo esempio è buono.
Penso che questo sia molto meglio perché qui stiamo scaricando ma, se puoi vedere qui, stiamo dicendo che
queste due tracce sono in realtà queste affermazioni che vengono stampate dalla prossima Internet.
E qui stiamo vedendo Tucows e non scaricati sotto dissipazione.
OK, quindi queste due tracce del 2001 2002 sono state prese a calci prima che il corrispondente downloader fosse troncato.
OK, così che è entrato nel sincronizzato e nel 2000 o 2001 2002 stiamo vedendo Nakia scaricato in giornata andando
allo stato di attesa qui.
Ora torniamo qui.
Il tempo è scaduto e uno di questi era il 2000.
Quindi per il 2000 il download è stato completato.
Ma prima di lavorare per notificare tutto Xserve perché il metodo di interrupt è già stato chiamato e sotto il
documento con la I. D. Tozan è all'interno di questo otto mentore che vi sta violentando.
Quindi a causa di ciò, Richard ular finirà in realtà solo.
E a causa di ciò.
Quindi questa pagina questa dichiarazione non verrà eseguita e andrà in questa complessa eccezione e sta
eseguendo questa operazione di pulizia.
OK.
Questo è il mio gusto per il mixer interrotto qui.
Ed è l'operazione di pulizia è quella di chiamare questo metodo di arresto, tranne smettere di ferire la verità.
Così facendo, in realtà chiuderà l'altro terzo del flusso di input.
Quindi questo è ciò che sta accadendo ma lontano.
Ma cosa sta succedendo qui.
Dopo un secondo anche il thread del downloader sta scaricando ha anche finito di scaricare la pagina contemporaneamente.
Quindi è solo un po 'difficile simularlo se cade se il terzo è in attesa.
È quello il thread corrispondente che 2000 o ha deciso cosa succede.
Se ti aspettava per qualche altro secondo, avremmo potuto vedere che dove il flusso di input è
chiuso e questo costringerebbe la minaccia a entrare.
Quindi siamo un po 'difficili da condividere qui perché queste sono tutte pagine web
e non abbiamo il controllo su come sai come risponderanno.
Quindi comunque penso che tu abbia avuto un'idea su questo.
Puoi anche dare un'occhiata a questo programma che sarà nella sezione delle risorse.
Quindi il problema che abbiamo visto prima era che i camion stavano effettivamente aspettando qui e stavano
aspettando qui il giorno dopo.
Non siamo in grado di interromperli.
Quindi se vuoi farlo allora dobbiamo usare dei lock espliciti su questo.
Vedremo nella prossima lezione è per ora.
Grazie e felice Cody.