style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Thread.yield()

Hola a todos,

Tengo una duda con el método yield() de la clase thread... tengo entendido que el método yield() se basa en prioridades, y si un método con menor prioridad esta ejecutandose y llega uno de mayor prioridad, toma el de menor prioridad y lo regresa al estado RUNNABLE y al de mayor prioridad le da el uso del recurso.

Tengo un código el siguiente código que esta en una clase llamada Stack:

     public void push(int x, String name) {
        if(index <= 9) {
           values[index] = x;
           Thread.yield();
           index++;
        }
    }
 

Tengo otra clase llamada Pusher que extiende a Thread:

   public void run() {
      for(int i = 1; i <= 5; i++) {
         stack.push(i,identifier);
      }
   }
       
   public static void main(String [] args){
        MyStack stack = new MyStack();
        Pusher one = new Pusher(stack,"Thread1");
        Pusher two = new Pusher(stack,"Thread2");
        one.start();
        two.start();
        try {
                one.join();
                two.join();
        }catch(InterruptedException e) {}
                System.out.println(stack.toString());
        }
 

Mi confusión es cuando se llega a la línea Thread.yield(), siempre que entre un thread a utilizar ese código sería enviado al estado RUNNABLE? Si es así entonces nunca se ejecutaría el aumento de index...

Me podrian aclarar que es lo que realmente sucede, porque cuando lo ejecuto siempre se aumenta index.

Saludos y gracias :D

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

yield

Nunca confíes en lo que va a hacer el manejador de hilos porque depende del sistema operativo, y de los otros procesos que haya corriendo dentro y fuera de la JVM, etc.

El método yield es para que le cedas el procesador a otro hilo. Se debe usar en código que realiza una tarea muy intensiva y que sabes que va a ocupar mucho CPU; digamos un ciclo muy largo que sabes que medio se apaña el CPU y ataranta lo demás. Dentro de dicho loop puedes poner que por ejemplo cada 100 iteraciones (o el número que decidas, dependiendo lo que tarde una iteración) llames el yield() para que en ese momento el scheduler pueda darle oportunidad a otros procesos de usar el CPU; tu proceso va a pausar un poco y luego va a continuar. Pero a final de cuentas la ejecución siempre continúa, es solamente una pausa temporal.

Podría decirse que el yield() es un método de buena educación. Si tienes código que sabes que se apaña el CPU puedes meter una llamada ocasional a yield() para que los demás procesos (dentro y fuera de la JVM) tengan oportunidad de hacer algo.

yield

Ok.. gracias...
Otra duda.. La primera vez que corro el código parece que entran los dos al mismo tiempo, entonces cuando llega al yield() estaria sacando a uno de los threads?

Imagen de ezamudio

Yield == ceder

Yield significa "ceder" en inglés. No sacas threads. No termina la ejecución de nada. El método yield() simplemente le avisa al scheduler que le puede pasar el control a otro proceso, y el proceso que invoca yield() podríamos decir que se queda en pausa, pero no termina su ejecución; eventualmente el control regresará ese proceso y continuará su ejecución.

El proceso que pusiste en tu ejemplo no es para nada intensivo en CPU por lo que el método puede que no tenga mucho efecto. Además el scheduler puede decidir no pasarle el control a nadie más porque nadie más necesite el CPU en ese momento y por lo tanto la ejecución del proceso que invocó yield() continúa de manera normal.

Además en este caso estás corriendo lo mismo en dos threads separados, así que los dos van a estar invocando yield() a cada rato. Básicamente implementaste a Pixie y Dixie en Java; "después de usted", "no no, después de usted", etc. Pero como no es muy intensivo ni tardado lo que hacen, seguramente parecerá que los dos corren prácticamente al mismo tiempo. El efecto de yield() es más evidente si tienes dos threads ejecutando código distinto, uno de ellos haciendo algo que ocupe todo el CPU y otro algo muy leve. El que ocupa todo el CPU llama a yield() y entonces ves que el otro proceso corre un rato, luego sigue el intensivo y a la siguiente llamada a yield() va a correr el otro, etc. Pero aun asi es difícil que lo notes con solamente 2 procesos, necesitarías echar a andar cientos o miles de procesos para que que veas el efecto (si uno solo de ellos llama yield(), será el que menos corra porque los demás no tienen la misma cortesía).

Yield == ceder

Gracias, resolviste mi duda... :D

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">