resueltos que programas multitarea multihilos multihilo hilos fuente ejemplos creacion control codigo asincronos aplicaciones java multithreading threadpool

que - hilos en java netbeans



¿Cuál es el uso de un grupo de subprocesos en Java? (6)

¿Para qué sirve un grupo de subprocesos? ¿Hay un buen ejemplo del mundo real?


Las agrupaciones de subprocesos son útiles solo en una situación de tipo servidor-cliente donde el número / ocurrencia de las solicitudes de los clientes no se puede determinar / predecir.

En este escenario, la creación de un nuevo subproceso cada vez que se realiza una solicitud de cliente tiene dos desventajas:

1) Latencia de tiempo de ejecución para la creación de subprocesos: la creación de un subproceso requiere algo de tiempo, por lo que el trabajo real no se inicia tan pronto como aparece la solicitud. El cliente puede notar un ligero retraso.

Este criterio es crucial en los sistemas interactivos, donde el cliente espera una acción inmediata.

2) Uso no controlado de los recursos del sistema: los subprocesos consumen recursos del sistema (memoria, etc.), por lo que el sistema puede quedarse sin recursos en caso de que exista un flujo de solicitudes de clientes sin precedentes.

Los grupos de subprocesos abordan las preocupaciones anteriores por:
1) Crear un número específico de subprocesos en el inicio del servidor en lugar de crearlos durante el tiempo de ejecución.
2) Limitar la cantidad de hilos que se están ejecutando en un momento dado.

Nota: Lo anterior es aplicable para grupos de subprocesos de tamaños fijos.


Puede suponer que los hilos son los trabajadores reales y las agrupaciones de subprocesos para ser un grupo de trabajadores. Puede crear múltiples grupos por varias razones, como prioridad, propósito, etc. Por lo tanto, aunque un grupo puede ser para tareas generales como programas de fondo, difusión de correo electrónico, etc., puede haber un grupo de procesamiento de transacciones para procesar simultáneamente varias transacciones. En el caso de un Servicio Ejecutor, estoy seguro de que no le gustaría retrasar los trabajos transaccionales que se completarán después de que no se completen otras actividades no críticas como los correos electrónicos de confirmación de transmisión o las actividades de mantenimiento de la base de datos. Puede segregarlos en grupos y mantenerlos de forma independiente. Esa es una respuesta muy simplista sin entrar en jergas técnicas. Saludos, KT


Un grupo de subprocesos es un grupo de subprocesos creados inicialmente que espera trabajos y los ejecuta. La idea es tener los hilos siempre existentes, para que no tengamos que pagar tiempo de sobrecarga para crearlos todo el tiempo. Son apropiados cuando sabemos que hay una secuencia de trabajos para procesar, aunque puede haber un tiempo en el que no haya trabajos.

Aquí hay un buen diagrama de Wikipedia :



Thread Pools de Java Tutorials tiene una buena visión general:

El uso de subprocesos de trabajo minimiza la sobrecarga debido a la creación de subprocesos. Los objetos de subprocesos utilizan una cantidad significativa de memoria y, en una aplicación a gran escala, la asignación y desasignación de muchos objetos de subprocesos crea una sobrecarga significativa de administración de memoria.


El grupo de subprocesos es un conjunto de subprocesos de trabajo ya creados listos para hacer el trabajo. Crea Thread y los administra. En lugar de crear subprocesos y descartarlos una vez que finaliza la tarea, el grupo de subprocesos reutiliza los subprocesos en forma de subproceso de trabajo.

¿Por qué?

Porque la creación de subprocesos consume mucho tiempo y retrasa el procesamiento de solicitudes. También limita el número de clientes en función de la cantidad de subprocesos por JVM permitido, que obviamente es un número limitado.

Crear grupo de subprocesos de tamaño fijo utilizando el marco Executor -

Java 5 introdujo una función completa incorporada en el marco de Thread Pool conocido comúnmente como marco ejecutor .

La creación de un grupo de subprocesos de tamaño fijo utilizando Java 5 Executor framework es bastante fácil debido a los métodos de fábrica estáticos proporcionados por la clase Executors . Todo lo que necesita hacer es definir su tarea que desea ejecutar simultáneamente y luego enviar esa tarea a ExecutorService .

Desde aquí, el grupo de subprocesos se ocupará de cómo ejecutar esa tarea; puede ser ejecutado por cualquier hilo de trabajo libre.

public class ThreadPoolExample { public static void main(String args[]) { ExecutorService service = Executors.newFixedThreadPool(10); //create 10 worker threads in Thread Pool for (int i =0; i<100; i++){ service.submit(new Task(i)); //submit that to be done } } } final class Task implements Runnable { private int taskId; public Task(int id){ this.taskId = id; } @Override public void run() { System.out.println("Task ID : " + this.taskId +" performed by " + Thread.currentThread().getName()); } } Output: Task ID : 0 performed by pool-1-thread-1 Task ID : 3 performed by pool-1-thread-4 Task ID : 2 performed by pool-1-thread-3 Task ID : 1 performed by pool-1-thread-2 Task ID : 5 performed by pool-1-thread-6 Task ID : 4 performed by pool-1-thread-5 *Output may vary from system to system