Différence entre attente et sommeil en Java

Différence entre attente et sommeil en Java

1. Vue d'ensemble

Dans ce court article, nous allons examiner les méthodes standardsleep() etwait() dans le noyau Java, et comprendre les différences et les similitudes entre elles.

2. Différences générales entreWait etSleep

En termes simples,wait() is an instance method that’s used for thread synchronization.

Il peut être appelé sur n’importe quel objet, tel qu’il est défini directement surjava.lang.Object, mais il peutonly be called from a synchronized block. Il libère le verrou sur l'objet afin qu'un autre thread puisse s'y insérer et acquérir un verrou.

D'autre part,Thread.sleep() est une méthode statique qui peut être appelée à partir de n'importe quel contexte. Thread.sleep() pauses the current thread and does not release any locks.

Voici un premier aperçu très simpliste de ces deux API principales en action:

private static Object LOCK = new Object();

private static void sleepWaitExamples()
  throws InterruptedException {

    Thread.sleep(1000);
    System.out.println(
      "Thread '" + Thread.currentThread().getName() +
      "' is woken after sleeping for 1 second");

    synchronized (LOCK) {
        LOCK.wait(1000);
        System.out.println("Object '" + LOCK + "' is woken after" +
          " waiting for 1 second");
    }
}

L'exécution de cet exemple produira la sortie suivante:

Le fil «principal» est réveillé après avoir dormi pendant 1 seconde L'objet «[email protected]» est réveillé après une attente d'une seconde

3. Réveil deWait etSleep

Lorsque nous utilisons la méthodesleep(), un thread démarre après un intervalle de temps spécifié, à moins qu'il ne soit interrompu.

Pourwait(), le processus de réveil est un peu plus compliqué. Nous pouvons réveiller le thread en appelant les méthodesnotify() ounotifyAll() sur le moniteur en attente.

UtiliseznotifyAll() au lieu denotify() lorsque vous souhaitez réveiller tous les threads en attente. De la même manière que la méthodewait() elle-même, lesnotify() etnotifyAll() doivent être appelés à partir du contexte synchronisé.

Par exemple, voici comment vous pouvezwait:

synchronized (b) {
    while (b.sum == 0) {
        System.out.println("Waiting for ThreadB to complete...");
        b.wait();
    }

    System.out.println("ThreadB has completed. " +
      "Sum from that thread is: " + b.sum);
}

Et puis, voici comment un autre thread peut alorswake up the waiting thread – by calling notify() on the monitor:

int sum;

@Override
public void run() {
    synchronized (this) {
        int i = 0;
        while (i < 100000) {
            sum += i;
            i++;
        }
        notify();
    }
}

L'exécution de cet exemple produira la sortie suivante:

Waiting for ThreadB to complete…ThreadB has completed. Sommefrom that thread is: 704982704

4. Conclusion

Ceci est une introduction rapide à la sémantique dewait etsleep en Java.

En général, nous devrions utilisersleep() pour contrôler le temps d'exécution d'un thread etwait() pour la synchronisation multi-thread. Naturellement, il y a beaucoup plus à explorer - après avoir bien compris les bases.

Comme toujours, vous pouvez consulter les exemples fournis dans cet articleover on GitHub.