"Ciao Amico!

"Tutto ciò che è nuovo è solo qualcosa di vecchio che abbiamo dimenticato. Oggi parlerò dell'arresto dei thread. Spero che tu abbia già dimenticato come funziona il metodo interrupt()."

"Sì, Ellie, l'ho completamente dimenticato."

"Fantastico. Allora te lo ricorderò."

"In Java, se qualcuno vuole interrompere un thread in esecuzione, può segnalarlo al thread. Per fare ciò, è necessario impostare la variabile nascosta isInterrupted dell'oggetto Thread su true."

"Ogni Thread ha un metodo interrupt(), che viene utilizzato per impostare questo flag. Quando viene chiamato il metodo interrupt (), la variabile isInterrupted all'interno dell'oggetto Thread viene impostata su true."

"E quando il metodo Thread.sleep() o join() viene chiamato su un thread, il metodo controlla se il flag isInterrupted è impostato per il thread corrente. Se questo flag è impostato (la variabile isInterrupted è uguale a true), allora i metodi lancia un'InterruptedException . "

"Ecco, ti ricorderò un vecchio esempio:"

Codice Descrizione
class Clock implements Runnable
{
public void run()
{
Thread current = Thread.currentThread();

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tik");
}
}
}
Il metodo run di Clock ottiene l'oggetto Thread per il thread corrente.

La classe Clock scrive la parola "Tick" nella console una volta al secondo finché la variabile isInterrupt del thread corrente è falsa.

Quando isInterrupt diventa true, il metodo run termina.

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clockThread.interrupt();
}
Il thread principale avvia un thread figlio (orologio) che dovrebbe essere eseguito per sempre.

Attendere 10 secondi e annullare l'attività chiamando il metodo di interruzione.

Il thread principale termina il suo lavoro.

Il filo dell'orologio termina il suo lavoro.

"Qui usiamo il metodo sleep come parte di un ciclo infinito nel metodo run . Nel ciclo, la variabile isInterrupt viene verificata automaticamente. Se un thread chiama il metodo sleep , il metodo prima controlla se isInterrupt è vero per quel thread (il uno che ha chiamato il metodo sleep) .

"Ma in questo esempio, controlliamo costantemente la variabile isInterrupted nella condizione del ciclo."

"Ricordo che c'erano alcuni motivi per cui non potevamo usare questo approccio. Potresti ricordarmelo?"

" In primo luogo , il metodo run non ha sempre un ciclo. Il metodo potrebbe consistere semplicemente in poche dozzine di chiamate ad altri metodi. In questo caso, dovresti aggiungere un controllo isInterrupted prima di ogni chiamata al metodo."

" In secondo luogo , alcuni metodi che comportano molte azioni diverse potrebbero richiedere molto tempo per essere eseguiti."

" In terzo luogo , il lancio di un'eccezione non sostituisce il controllo isInterrupted. È solo un'aggiunta utile. L'eccezione generata consente di srotolare rapidamente lo stack di chiamate al metodo run stesso."

" In quarto luogo , il metodo sleep è molto utilizzato. Si scopre che questo utile metodo è potenziato da un controllo implicito che non è meno utile. È  come se nessuno avesse aggiunto specificamente il controllo, ma è così.  Questo è super prezioso quando tu stai usando il codice di qualcun altro e non puoi aggiungere tu stesso il controllo."

" Quinto , il controllo aggiuntivo non degrada le prestazioni. Chiamare il metodo sleep significa che il thread non dovrebbe fare nulla (tranne dormire), quindi il lavoro extra non infastidisce nessuno."

"È esattamente quello che hai detto prima."

"E per quanto riguarda la tua affermazione, « Nessuno può garantire che un thread verrà interrotto. Solo un thread può arrestarsi da solo. » Puoi spiegarlo?"

"Sicuro."

"In precedenza, nelle prime versioni di Java, i thread avevano un metodo stop(). E quando lo chiamavi, la JVM interrompeva effettivamente il thread. Ma se un thread stava facendo qualcosa al di fuori della JVM (ad esempio, scrivere su un file o chiamare funzioni del sistema operativo) quando è stato interrotto in questo modo, l'interruzione ha causato molti problemi, come file non chiusi, risorse di sistema non rilasciate, ecc."

"Un'assemblea generale dei creatori di Java ha deciso di rimuovere il metodo per l'arresto forzato dei thread. Ora tutto ciò che possiamo fare è impostare un determinato flag (isInterrupted) e sperare che il codice del thread sia stato scritto correttamente, in modo che questo flag venga elaborato. Questo flag è come un cartello che dice: 'Infila, fermati, per favore. È molto importante!'. Ma che si fermi o meno sono affari suoi."

"Ma per quanto riguarda InterruptedException?"

"Cosa succede se il codice in esecuzione su questo thread ha una serie di blocchi try-catch? Anche se si verifica un'eccezione interrotta da qualche parte, non c'è assolutamente alcuna garanzia che alcuni try-catch non lo rilevino e se ne dimentichino. Quindi non ci sono garanzie che il il filo si fermerà."

"Un'altra cosa è che i thread sono già considerati programmi di basso livello. Ma te ne parlerò la prossima volta."

"Non sei Ellie, sei Scheherazade!"

"Allora, Amigo! È tutto chiaro nella lezione attuale?"

"Sì."

"Buono ok."