JavaRush /Blog Java /Random-ES /Aprecia el tiempo con las transmisiones.
Andrei
Nivel 2

Aprecia el tiempo con las transmisiones.

Publicado en el grupo Random-ES

Prefacio. Tío Petia

Entonces, digamos que queremos llenar una botella de agua. Hay una botella y un grifo de agua del tío Petya disponibles. El tío Petya hizo instalar un grifo nuevo hoy y siguió elogiando su belleza. Antes de eso, solo usaba un grifo viejo y atascado, por lo que las colas en el embotellado eran enormes. Después de hurgar un poco, se escuchó el sonido del agua llenándose desde la dirección del derrame, después de 2 minutos la botella todavía está en la etapa de llenado, la cola habitual se ha formado detrás de nosotros y la imagen en mi cabeza es de lo cariñoso que es el tío. Petya selecciona sólo las mejores moléculas de H2O en nuestra botella. El tío Petya, entrenado por la vida, calma a los especialmente agresivos y promete terminar lo más rápido posible. Habiendo terminado con la botella, toma la siguiente y abre la presión habitual, lo que no revela todas las capacidades del nuevo grifo. La gente no es feliz... Apreciando el tiempo con streams - 1

Teoría

Multithreading es la capacidad de una plataforma de crear múltiples threads dentro de un solo proceso. Crear y ejecutar un hilo es mucho más sencillo que crear un proceso, por lo que si es necesario implementar varias acciones paralelas en un programa, se utilizan hilos adicionales. En la JVM, cualquier programa se ejecuta en el hilo principal y el resto se inicia desde él. Dentro del mismo proceso, los hilos pueden intercambiar datos entre sí. Al iniciar un nuevo hilo, puede declararlo como hilo de usuario usando el método
setDaemon(true);
dichos subprocesos finalizarán automáticamente si no quedan otros subprocesos en ejecución. Los subprocesos tienen prioridad de trabajo (la elección de la prioridad no garantiza que el subproceso de mayor prioridad termine más rápido que el subproceso de menor prioridad).
  • PRIORIDAD_MINA
  • NORM_PRIORITY (predeterminado)
  • MAX_PRIORITY
Métodos básicos al trabajar con transmisiones:
  • run()– ejecuta el hilo
  • start()– inicia un hilo
  • getName()– devuelve el nombre del hilo
  • setName()– especifica el nombre de la secuencia
  • wait()– método heredado, el hilo espera a que el método sea llamado notify()desde otro hilo
  • notify()– método heredado, reanuda un hilo previamente detenido
  • notifyAll()– método heredado, reanuda hilos previamente detenidos
  • sleep()– pausa la transmisión durante un tiempo específico
  • join()– espera a que se complete el hilo
  • interrupt()– interrumpe la ejecución del hilo
Se pueden encontrar más métodos aquí. Es hora de pensar en nuevos hilos si su programa tiene:
  • Acceso a la red
  • Acceso al sistema de archivos
  • GUI

Clase de hilo

Los hilos en Java se representan como una clase Thready sus descendientes. El siguiente ejemplo es una implementación simple de la clase stream.
import static java.lang.System.out;

public class ExampleThread extends Thread{

    public static void main(String[] args) {
        out.println("Основной поток");
        new ExampleThread().start();
    }

    @Override
    public void run() {
        out.println("Новый поток");
    }
}
Como resultado obtenemos
Основной поток
Новый поток
Aquí creamos nuestra clase y la convertimos en descendiente de la clase Thread, después de lo cual escribimos el método main() para iniciar el hilo principal y anular el método run()de la clase Thread. Ahora, habiendo creado una instancia de nuestra clase y ejecutado su método heredado, start()lanzaremos un nuevo hilo en el que se ejecutará todo lo descrito en el cuerpo del método run(). Suena complicado, pero mirando el código de ejemplo todo debería quedar claro.

Interfaz ejecutable

Oracle también sugiere implementar la interfaz para iniciar un nuevo hilo Runnable, lo que nos da más flexibilidad de diseño que la única herencia disponible en el ejemplo anterior (si miras el código fuente de la clase Threadpuedes ver que también implementa la interfaz Runnable). Utilicemos el método recomendado para crear un nuevo hilo.
import static java.lang.System.out;

public class ExampleRunnable implements Runnable {

    public static void main(String[] args) {
        out.println("Основной поток");
        new Thread(new ExampleRunnable()).start();
    }

    @Override
    public void run() {
        out.println("Новый поток");
    }
}
Como resultado obtenemos
Основной поток
Новый поток
Los ejemplos son muy similares, porque Al escribir el código, tuvimos que implementar un método abstracto run()descrito en la interfaz Runnable. Lanzar un nuevo hilo es un poco diferente. Creamos una instancia de la clase Threadpasando una referencia a una instancia de nuestra implementación de interfaz como parámetro Runnable. Es este enfoque el que le permite crear nuevos hilos sin heredar directamente la clase Thread.

Operaciones largas

El siguiente ejemplo mostrará claramente los beneficios de utilizar varios subprocesos. Digamos que tenemos una tarea simple que requiere varios cálculos largos, antes de este artículo la habríamos resuelto en un método, main()tal vez dividiéndola en métodos separados para facilitar la percepción, tal vez incluso clases, pero la esencia sería la misma. Todas las operaciones se realizarían secuencialmente una tras otra. Simulemos cálculos pesados ​​y midamos su tiempo de ejecución.
public class ComputeClass {

    public static void main(String[] args) {
        // Узнаем стартовое время программы
        long startTime = System.currentTimeMillis();

        // Определяем долгосрочные операции
        for(double i = 0; i < 999999999; i++){
        }
        System.out.println("complete 1");
        for(double i = 0; i < 999999999; i++){
        }
        System.out.println("complete 2");
        for(double i = 0; i < 999999999; i++){
        }
        System.out.println("complete 3");

        //Вычисляем и выводим время выполнения программы
        long timeSpent = System.currentTimeMillis() - startTime;
        System.out.println("программа выполнялась " + timeSpent + " миллисекунд");
    }
}
Como resultado obtenemos
complete 1
complete 2
complete 3
программа выполнялась 9885 миллисекунд
El tiempo de ejecución deja mucho que desear, y todo este tiempo estamos mirando una pantalla de salida en blanco, y la situación es muy similar a la historia del tío Petya, solo que ahora nosotros, los desarrolladores, no hemos aprovechado su papel. todas las capacidades de los dispositivos modernos. Mejoraremos.
public class ComputeClass {

    public static void main(String[] args) {
        // Узнаем стартовое время программы
        long startTime = System.currentTimeMillis();

        // Определяем долгосрочные операции
        new MyThread(1).start();
        new MyThread(2).start();
        for(double i = 0; i < 999999999; i++){
        }
        System.out.println("complete 3");

        //Вычисляем и выводим время выполнения программы
        long timeSpent = System.currentTimeMillis() - startTime;
        System.out.println("программа выполнялась " + timeSpent + " миллисекунд");
    }
}

class MyThread extends Thread{
int n;

MyThread(int n){
    this.n = n;
}

    @Override
    public void run() {
        for(double i = 0; i < 999999999; i++){
        }
        System.out.println("complete " + n);
    }
}
Como resultado obtenemos
complete 1
complete 2
complete 3
программа выполнялась 3466 миллисекунд
El tiempo de ejecución se ha reducido significativamente (es posible que este efecto no se logre o incluso aumente el tiempo de ejecución en procesadores que no admiten subprocesos múltiples). Vale la pena señalar que los hilos pueden terminar desordenados, y si el desarrollador necesita previsibilidad de acciones, debe implementarla de forma independiente para un caso específico.

Grupos de hilos

Los subprocesos en Java se pueden combinar en grupos; para ello se utiliza la clase ThreadGroup. Los grupos pueden incluir tanto hilos individuales como grupos completos. Esto puede resultar útil si necesita interrumpir los flujos asociados, por ejemplo, con la red cuando se pierde la conexión. Puedes leer más sobre los grupos aquí . Espero que ahora el tema te haya quedado más claro y tus usuarios estén contentos.
Apreciando el tiempo con streams - 2
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION