Breve introducción a Java Thread.yield ()

1. Información general

En este tutorial, exploraremos el método yield () en la clase Thread .

Lo compararemos con otros modismos de concurrencia disponibles en Java y eventualmente exploraremos sus aplicaciones prácticas.

2. Sinopsis de rendimiento ()

Como sugiere la documentación oficial, yield () proporciona un mecanismo para informar al "planificador" que el hilo actual está dispuesto a renunciar a su uso actual del procesador, pero que le gustaría volver a programarlo lo antes posible.

El "programador" es libre de adherirse o ignorar esta información y, de hecho, tiene un comportamiento variable según el sistema operativo.

El siguiente fragmento de código muestra dos subprocesos con la misma prioridad que se producen después de cada programación:

public class ThreadYield { public static void main(String[] args) { Runnable r = () -> { int counter = 0; while (counter < 2) { System.out.println(Thread.currentThread() .getName()); counter++; Thread.yield(); } }; new Thread(r).start(); new Thread(r).start(); } }

Cuando intentamos ejecutar el programa anterior varias veces, obtenemos resultados diferentes; algunos de ellos se mencionan a continuación:

Ejecutar 1:

Thread-0 Thread-1 Thread-1 Thread-0

Ejecutar 2:

Thread-0 Thread-0 Thread-1 Thread-1

Como puede ver, el comportamiento de yield () no es determinista y también depende de la plataforma.

3. Comparación con otros modismos

Hay otras construcciones para afectar la progresión relativa de los hilos. Incluyen wait () , notificar () y notificar a todos () como parte de la clase Object , join () como parte de la clase Thread y sleep () como parte de la clase Thread .

Veamos cómo se comparan con yield () .

3.1. rendimiento () vs esperar ()

  • Mientras que yield () se invoca en el contexto del hilo actual, wait () solo se puede invocar en un bloqueo adquirido explícitamente dentro de un bloque o método sincronizado
  • A diferencia de yield () , es posible que wait () especifique un período de tiempo mínimo para esperar antes de cualquier intento de programar el hilo nuevamente
  • Con wait () también es posible despertar el hilo en cualquier momento a través de una invocación de notificar () o notifyAll () en el objeto de bloqueo en cuestión

3.2. rendimiento () vs dormir ()

  • Mientras que yield () solo puede hacer un intento heurístico de suspender la ejecución del hilo actual sin garantía de cuándo se programará nuevamente, sleep () puede forzar al programador a suspender la ejecución del hilo actual durante al menos el tiempo mencionado período como parámetro.

3.3. rendimiento () vs unirse ()

  • El hilo actual puede invocar join () en cualquier otro hilo, lo que hace que el hilo actual espere a que el otro hilo muera antes de continuar.
  • Opcionalmente, puede mencionar un período de tiempo como parámetro que indica el tiempo máximo que debe esperar el hilo actual antes de reanudar.

4. Uso para rendimiento ()

Como sugiere la documentación oficial, rara vez es necesario usar yield () y, por lo tanto, debe evitarse a menos que sea muy claro con los objetivos a la luz de su comportamiento.

No obstante, algunos de los usos de yield () incluyen diseñar construcciones de control de concurrencia, mejorar la capacidad de respuesta del sistema en un programa de procesamiento pesado, etc.

Sin embargo, estos usos deben ir acompañados de perfiles detallados y evaluaciones comparativas para garantizar el resultado deseado.

5. Conclusión

En este breve artículo, discutimos el método yield () en la clase Thread y vimos su comportamiento y limitaciones a través de un fragmento de código.

También exploramos su comparación con otros modismos de concurrencia disponibles en Java y finalmente analizamos algunos de los casos de uso en los que yield () podría ser útil.

Como siempre, puede consultar los ejemplos proporcionados en este artículo en GitHub.