Middle
Qual è la differenza tra i metodi interrupted() e isInterrupted() in Java?
sobes.tech AI
Risposta dell'AI
isInterrupted() verifica se il thread corrente ha impostato il flag di interruzione, senza resetarlo.
interrupted() verifica se il thread corrente ha impostato il flag di interruzione, e lo resetta dopo la verifica, se era impostato. Questo metodo è static.
Esempio:
// Creiamo un thread
Thread t = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
// Esegui lavoro utile
}
System.out.println("Thread interrotto.");
});
// Avvia il thread
t.start();
// Interrompi il thread
t.interrupt();
// Controlla lo stato del flag dopo interrupt() con isInterrupted()
System.out.println("isInterrupted() dopo interrupt(): " + t.isInterrupted()); // Dovrebbe essere true
try {
// Attendi che il thread finisca (in questo caso, finirà rapidamente)
t.join();
} catch (InterruptedException e) {
// Ripristina il flag di interruzione se join() viene interrotta
Thread.currentThread().interrupt();
}
// Controlla lo stato del flag dopo interrupt() con interrupted() (da un altro thread!)
// Attenzione: chiamare interrupted() da un altro thread non ha senso,
// poiché interrupted() lavora con il flag del thread che lo chiama.
// Per dimostrare il funzionamento di interrupted(), bisogna chiamarlo dal thread interrotto stesso.
// Esempio di chiamata a interrupted() in un altro thread (non correlato a t)
System.out.println("interrupted() dal thread corrente: " + Thread.interrupted()); // Dovrebbe essere false (se il thread corrente non è stato interrotto)
Differenza chiave:
| Metodo | Il flag di interruzione viene reset? | Tipo di metodo |
|---|---|---|
isInterrupted() |
No | Istanza |
interrupted() |
Sì | Statico |