Réveiller un thread

Un thread qui s'est endormi (de lui-même par la méthode "sleep") peut être réveillé par un autre thread avec la méthode "interrupt".

Exemple :

public class Dormeur implements Runnable {
    public void run() {
        try {
            System.out.println("S'endort pour 10 secondes...");
            Thread.sleep(10000);
            System.out.println("Se réveille de lui-même");
        } catch (InterruptedException ie) {
            System.out.println("Se fait reveiller");
        }
    }
    
    public static void main(String args[]) {
        // créer et lancer le thread
        Thread t = new Thread(new Dormeur());
        t.start();
        
        // laisser le temps au dormeur de s'endormir
        // avant que le thread principal ne se termine
        try {
            Thread.sleep(1); // une milliseconde
        } catch (InterruptedException ie) {}
        
        System.out.println("Reveille le thread à partir de main()");
        t.interrupt();

        // laisser le temps au dormeur de se réveiller
        // avant que le thread principal ne se termine
        try {
            Thread.sleep(1); // une milliseconde
        } catch (InterruptedException ie) {}

        System.out.println("Sort de main()");        
    }
}

Sortie :

C:\>java Dormeur
S'endort pour 10 secondes...
Reveille le thread à partir de main()
Se fait reveiller
Sort de main()

C:\>

Notez que cela fonctionne même si le thread réveillé n'a pas été créé par le thread qui le réveille.