Sobes.tech
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() Statico