JavaRush /Blog Java /Random-ES /Subprocesos múltiples en Java

Subprocesos múltiples en Java

Publicado en el grupo Random-ES

Introducción

Antes de aprender sobre los subprocesos de Java, miremos hacia el futuro cercano. Imagine que envió su currículum y tuvo una entrevista. Usted y un par de docenas de futuros colegas han sido invitados a trabajar en una gran empresa de software. Entre otras molestias, es necesario presentar documentos en papel para el empleo a un empleado de recursos humanos cansado.
Subprocesos múltiples en Java - 1
Para agilizar el proceso, los aspirantes al puesto se pueden dividir en dos grupos y distribuir entre dos responsables de RRHH (si los hay en la empresa). Como resultado, aceleramos el proceso gracias al trabajo de diseño paralelo .
Subprocesos múltiples en Java - 2
Si solo hay un oficial de personal en la empresa, entonces tendrá que salir de alguna manera. Por ejemplo, puede volver a dividir a todos en dos grupos, por ejemplo, entrevistar a niñas y niños por turno.
Subprocesos múltiples en Java - 3
O según otro principio: como hay más personas en el grupo inferior, alternaremos dos chicas por un chico.
Subprocesos múltiples en Java - 4
Esta forma de organizar el trabajo se llama multiproceso . Nuestro cansado oficial de recursos humanos cambia a diferentes grupos para reclutar al siguiente empleado de ellos. Hay quizás once grupos y cuatro oficiales de personal. En este caso, el procesamiento de subprocesos múltiples se realizará en paralelo por parte de varios RR.HH., quienes pueden seleccionar a la siguiente persona de cualquier grupo para procesar sus documentos.

Procesos

El proceso ( proceso ) en este caso será la organización del trabajo de recepción de documentos. En una organización se pueden distinguir varios procesos: contabilidad, desarrollo de software, reuniones con clientes, operaciones de almacén, etc. Para cada proceso se asignan recursos: locales, empleados para su ejecución. Los procesos están aislados unos de otros: los responsables de recursos humanos no tienen acceso a la base de datos contable y los responsables de atención al cliente no corren por el almacén. Si un proceso necesita acceder a los recursos de otra persona, es necesario establecer comunicación entre procesos: memorandos, reuniones conjuntas.

Corrientes

El trabajo en un proceso se organiza en hilos ( java thread). Para el departamento de RRHH, el flujo es la organización del trabajo para servir a un grupo. En la primera imagen hay un flujo, en las tres siguientes hay dos. Dentro del proceso, se pueden ejecutar subprocesos en paralelo: dos responsables de recursos humanos aceptan dos o más grupos de futuros empleados. La interacción de los oficiales de personal con los grupos (el procesamiento de subprocesos dentro de un proceso) se denomina sincronización de subprocesos . Los dibujos del diseño de dos grupos por parte de un oficial de personal muestran métodos: uniforme (niña - niño - niña - niño) y con diferentes prioridades (dos niñas se alternan con un niño). Los hilos tienen acceso a los recursos del proceso al que pertenecen: los grupos del responsable de recursos humanos reciben muestras de formularios de solicitud y bolígrafos para completar documentos. Pero si los flujos interactúan con cosas que les son comunes, entonces es posible que se produzcan incidentes. Si el oficial de personal le pide que grite el nombre de la última persona en la cola, entonces, en el caso de dos grupos, no está seguro de antemano si escuchará el nombre de una mujer o de un hombre. Estos conflictos de acceso a datos, bloqueos y formas de resolverlos son un tema muy importante.

Estados de flujo

Cada hilo se encuentra en uno de los siguientes estados:
  • Creado ( New): la fila para el oficial de recursos humanos se está preparando, la gente se está organizando.
  • Lanzado ( Runnable): nuestra cola se ha alineado para el oficial de recursos humanos y está siendo procesada.
  • Bloqueado ( Blocked): el último chico de la cola intenta gritar un nombre, pero cuando escuchó que la chica del siguiente grupo empezó a hacerlo antes que él, se quedó en silencio.
  • Completado ( Terminated): el oficial de recursos humanos ha completado toda la cola y no es necesario.
  • Esperando ( Waiting): una cola está esperando una señal de otra.
La organización de subprocesos y su interacción es la base para el funcionamiento eficaz de los procesos.

Volvamos al mundo TI

En el siglo XXI, la ejecución paralela y multiproceso se ha vuelto relevante. Desde los años 90 del siglo pasado, los sistemas operativos multitarea Windows, MacOS y Linux se han consolidado firmemente en los ordenadores domésticos. A menudo puedes encontrar cuatro o más procesadores centrales en ellos. El número de bloques paralelos de tarjetas de video GPU ya superó los mil. Los programas populares se escriben teniendo en cuenta el subproceso múltiple (multiproceso), por ejemplo, versiones modernas de software para procesar gráficos, videos u operar con grandes cantidades de datos: Adobe Photoshop, WinRar, Mathematica, juegos modernos. El multiproceso de Java es un tema muy importante, popular y complejo. Por eso, en el curso de JavaRush hay muchas tareas para entenderlo muy bien. Los ejemplos de Java sobre subprocesos múltiples le ayudarán a dominar los matices y sutilezas básicos de esta área, sincronizando el trabajo de los subprocesos.

Proceso

Un proceso es una instancia en ejecución de un programa al que el sistema operativo (SO) ha asignado memoria, tiempo/núcleos de procesador y otros recursos. Es importante que la memoria se asigne por separado; los espacios de direcciones de diferentes procesos no son accesibles entre sí. Si los procesos necesitan comunicarse, pueden hacerlo mediante archivos, canalizaciones y otros métodos de comunicación entre procesos.

Fluir

Java Thread(corriente). A veces, para evitar confusiones con otras clases de Java Streamy similares, los subprocesos de Java suelen traducirse como subprocesos. Utilizan los recursos asignados a un proceso y son la forma en que se ejecuta el proceso. El hilo principal ejecuta el método mainy sale. Cuando se ejecuta un proceso, se pueden generar subprocesos adicionales (subprocesos secundarios). Los hilos del mismo proceso pueden intercambiar datos entre sí. El multiproceso de Java requiere que se tenga en cuenta la sincronización de datos, no lo olvides. En Java, un proceso termina cuando finaliza su último hilo. Para tareas en segundo plano, un subproceso se puede iniciar como un demonio ( daemon), la diferencia con uno normal es que se terminarán por la fuerza cuando daemonfinalicen todos los que no sean subprocesos del proceso.

Primera aplicación multiproceso

Hay más de media docena de formas de crear subprocesos; en el curso de JavaRush las examinaremos en detalle. Primero, familiaricémonos con uno de los básicos. Hay una clase especial Threaden cuyo método run()es necesario escribir código que implemente la lógica del programa. Después de crear un hilo, puede iniciarlo llamando al archivo start(). Escribamos un programa de demostración que implemente un ejemplo de subprocesos múltiples de Java.
class PeopleQueue extends Thread    {// Наша очередь из сотрудников, наследник класса Thread
    private String[] names;

    PeopleQueue(String... names) {// Конструктор, аргумент- массив имен сотрудников
        this.names = names;
    }

    @Override
    public void run() { // Этот метод будет вызван при старте потока
        for (int i = 0; i < names.length; i++) { // Вывод в цикле с паузой 0.5 сек очередного сотрудника
            System.out.println("Обработаны documentoы: " + names[i]);
            try {
                sleep(500); // Задержка в 0.5 сек
            } catch (Exception e) {}
        }
    }
}

public class HR    {// Класс для демонстрации работы потока
    public static void main(String[] args) {
        // Создаем две очереди
        PeopleQueue queue1 = new PeopleQueue("Iván","Сергей","Николай","Фердинанд","Albahaca");
        PeopleQueue queue2 = new PeopleQueue("Мария","Людмила","Алиса","Карина","olga");

        System.out.println("Начали!"); // Сообщение из главного потока программы
        queue1.start();    //Запускаем одну очередь (дочерний поток)
        queue2.start(); //Запускаем вторую (дочерний поток)
    }
}
Iniciemos el programa. La consola muestra el mensaje resultante del hilo principal. A continuación, cada hilo secundario queue1envía queue2a su vez mensajes a su consola común sobre el siguiente empleado procesado. Una de las posibles opciones para el programa:
Начали!
Обработаны documentoы: Мария
Обработаны documentoы: Iván
Обработаны documentoы: Людмила
Обработаны documentoы: Сергей
Обработаны documentoы: Алиса
Обработаны documentoы: Николай
Обработаны documentoы: Карина
Обработаны documentoы: Фердинанд
Обработаны documentoы: Ольга
Обработаны documentoы: Васoй

Process finished with exit code 0
El multiproceso en Java es un tema complejo y multifacético. La capacidad de escribir código utilizando computación paralela, multitarea y multiproceso lo ayudará a implementar tareas de manera efectiva en procesadores multinúcleo modernos y en clústeres que constan de muchas computadoras.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION