ejemplo de interfaz ejecutable

public class CreateThreadRunnableExample implements Runnable {

    public void run() {

        for (int i = 0; i < 5; i++) {
            System.out.println("Child Thread : " + i);

            try {
                Thread.sleep(50);
            } catch (InterruptedException ie) {
                System.out.println("Child thread interrupted! " + ie);
            }
        }

        System.out.println("Child thread finished!");
    }

    public static void main(String[] args) {

        Thread t = new Thread(new CreateThreadRunnableExample(), "My Thread");

        t.start();

        for (int i = 0; i < 5; i++) {

            System.out.println("Main thread : " + i);

            try {
                Thread.sleep(100);
            } catch (InterruptedException ie) {
                System.out.println("Child thread interrupted! " + ie);
            }
        }
        System.out.println("Main thread finished!");
    }
}

en este programa se utilizan dos métodos de suspensión de diferentes tiempos...,,, así que si el subproceso principal se ejecuta en tiempo, entonces el subproceso secundario tiene que ejecutarse 2 veces. pero se ejecuta solo una vez... tomamos el concepto de ejecución o ejecución estado ... luego, cuando finalice el subproceso principal, entonces 2 subprocesos secundarios estarán en estado listo, entonces ¿por qué solo se ejecuta un subproceso secundario?

preguntado el 22 de mayo de 12 a las 08:05

Esto se parece más a una corriente de conciencia que a una pregunta. ¿Qué estás tratando de averiguar? -

4 Respuestas

En primer lugar, ha agregado System.out.println ("¡Hilo secundario interrumpido!" + ie); tanto para el subproceso principal como para el secundario, eso es un error tipográfico...

Prueba esto... Ambos subprocesos se están ejecutando (principal y subproceso secundario)

El método principal de este programa se coloca en la parte inferior del subproceso principal creado por JVM, y el método principal crea otra pila de tiempo de ejecución y coloca el subproceso secundario en él.

public class DemoThread implements Runnable {

    public void run() {

        for (int i = 0; i < 3; i++) {
            System.out.println("Child Thread ");

            try {
                Thread.sleep(200);
            } catch (InterruptedException ie) {
                System.out.println("Child thread interrupted! " + ie);
            }
        }

        System.out.println("Child thread finished!");
    }

    public static void main(String[] args) {

        Thread t = new Thread(new DemoThread ());

        t.start();

        for (int i = 0; i < 3; i++) {

            System.out.println("Main thread);

            try {
                Thread.sleep(200);
            } catch (InterruptedException ie) {
                System.out.println("Child thread interrupted! " + ie);
            }
        }
        System.out.println("Main thread finished!");
    }
}

contestado el 22 de mayo de 12 a las 08:05

señor.... Sé que en este programa se ejecuta uno principal y otro secundario... pero quiero entender la lógica de mi programa... cuando ambos tienen diferentes horas de sueño. - chawla bimal

¿Debería decir el segundo mensaje de interrupción en su lugar? "Main thread interrupted!"? - fijo

La sleep método no es 100% preciso en el tiempo, como se indica en el Javoc:

el sueño vacío estático público (milis largo) arroja una excepción interrumpida

Hace que el subproceso que se está ejecutando actualmente entre en suspensión (deje de ejecutarse temporalmente) durante el número especificado de milisegundos, sujeto a la precisión y exactitud de los temporizadores y programadores del sistema. El subproceso no pierde la propiedad de ningún monitor.

Entonces, básicamente, el código a veces puede funcionar como se esperaba y otras veces no.

Además, parece que solo vas a tener 1 hijo, entonces, ¿por qué esperas 2?

EDITAR: en teoría, sí, el subproceso secundario debería ejecutarse dos veces mientras que el main hilo es dormido. Dicho esto, como se explica en el JavaDoc, la precisión con la que el sleep El método se ejecuta depende del sistema en el que se ejecuta, por lo que a veces puede hacer que funcione como se esperaba y otras veces no. Entonces, por ejemplo, podría tener escenarios donde el main hilo duerme pues, digamos por ejemplo, 97 milisegundos y no 100, mientras el niño duerme, digamos, 53 milisegundos. Esto hará que el niño se ejecute solo una vez.

Otra opción sería hacer algo así: while (currentTime <= timeNeededToElapse) { currentTime=... }. Esto provoca un ciclo de tiempo apretado que podría ofrecer un mejor control, pero aún así, que yo sepa, no es 100% preciso, sin mencionar que consumirá ciclos de CPU para no hacer nada de manera efectiva, por lo que debe usarse con precaución.

contestado el 22 de mayo de 12 a las 08:05

...como en los bucles for, ambos hilos tienen un sueño diferente....el sueño del niño es de 50ms...el hilo principal es de 100ms....estoy preguntando cuándo el hilo principal se ejecuta y duerme durante 100ms...en esos 100ms si el subproceso secundario se ejecuta dos veces o no ..... - chawla bimal

Está comenzando solo un subproceso secundario, entonces, ¿por qué espera dos?

Acerca de los tiempos de espera, el tiempo de suspensión no es exacto, por lo que mientras un subproceso duerme durante 100 ms, otro puede o no dormir dos veces durante 50 ms. Este es un ejemplo clásico de un condición de carrera. Si ejecuta el código de ejemplo varias veces, es posible que vea dos mensajes de subprocesos secundarios en algunos casos y uno en otros casos.

contestado el 22 de mayo de 12 a las 08:05

señor... sé que solo hay un subproceso secundario... pero tanto mqain como el subproceso secundario se ejecutan en un ciclo con tiempo de suspensión... quiero saber... ya que el tiempo de espera principal es de 100 ms y el subproceso secundario la suspensión es de 50 ms... también puede hacerlo cuando se ejecuta una suspensión principal... mientras tanto, 2 subprocesos secundarios se ejecutan en 50 ms - chawla bimal

@bimalchawla, como expliqué anteriormente, este puede sucede a veces (pero mi intuición es que probablemente no muy a menudo). El resultado de una condición de carrera es no determinista - solo puede decir algo sobre las probabilidades estadísticas (como: "el subproceso secundario se ejecuta dos veces durante los 100 ms de suspensión del subproceso principal en aproximadamente 1 de cada 4 ejecuciones") según el resultado de muchas ejecuciones independientes. - Péter Török

Los subprocesos son impredecibles, por lo que si desea algún control manual sobre ellos, utilice esperar y notificar. - Kumar Vivek Mitra

PRUEBA ESTO

  public class Test implements Runnable{

        public void run() {

            for (int i = 0; i < 5; i++) {
                System.out.println("CHILD THREAD : " + i);

                try {
                    Thread.sleep(50);
                } catch (InterruptedException ie) {
                    System.out.println("CHILD THREAD INTERRUPTED! " + ie);
                }
            }

            System.out.println("CHILD THREAD FINISHED!");
        }

        public static void main(String[] args) {

            Thread t = new Thread(new Test());

            t.start();

            for (int i = 0; i < 5; i++) {
                System.out.println("MAIN THREAD : " + i);
                try {
                    Thread.sleep(200);
                } catch (InterruptedException ie) {
                    System.out.println("CHILD THREAD INTERRUPTED! " + ie);
                }
            }
            System.out.println("MAIN THREAD FINISHED!");
        }
    }

contestado el 24 de mayo de 17 a las 14:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.