Java 9 : fluidifier les boucles d’attentes infinies en les rendant « Green »

En Java 8, le seul moyen de générer des boucles d’attente non trop consommatrice de temps CPU et d’énergie est d’utiliser un Thread.sleep.

Je m’explique, lorsque vous attendez un évènement au travers d’une variable  (ex : myEventIsOk ) vous utiliser un boule infinie (« spin loop« ) avec un Thread.sleep(1) afin de ne pas accaparer tous les temps CPU. Ce qui donne un code du genre :

void waitMyEvent() {
    while (!myEventIsOK) {
        Thread.sleep(1);
    }
    //ici mon événement est OK, je le traite 
}

Cella à pour inconvénient de devoir estimé un temps d’attente (et parfois 1ms c’est trop) et le deuxième effet de bord est de donner la main au système (au travers de Sleep), ce qui peut générer des attentes (sleep/wait) supérieures à la milliseconde indiquée.
Grosso modo pour ne pas accaparer tout le temps processeur vous générer des latences, ce n’est pas donc pas une véritable « boucle passive » !

Heureusement nos amis de Java 9 on résolut cette problématique en implémentant la méthode « Thread.onSpinWait()« , dans le JEP 285.
La méthode « Thread.onSpinWait() » a pour but dans le cadre de ces boucles infinies d’attente (« spin loop« ) de remplacer le « Thread.sleep()« , afin d’effectuer des boucles d’attentes consommant moins de temps CPU (et d’énergie, génial pour les batteries). Dans la mesure où il est possible d’effectuer des optimisations sur le processeur (architecture x86 s’y prête bien).

Ainsi nous avons une véritable « boucle passive », fluide et notre code devient écoresponsable (« Green ») 😉

Donc, à la sortie de Java 9, remplacer tous vos Thread.sleep() par Thread.onSpinWait().