Java multi-hilo 04-- uso racional de la agrupación de hebras

Antes de esto, tenemos un conocimiento básico de hilo, traerá el día de hoy, esta tecnología grupo de subprocesos. Estoy preocupado por el número de público "lado del código de Java" para aprender más conocimientos de Java-relacionado.

¿Por qué utilizar un grupo de subprocesos? Enhebrar la piscina para hacer el trabajo es principalmente para controlar el número de subprocesos que se ejecutan.

Tipo de grupo de subprocesos

Piscina hilo común en Java, hay cuatro: newCachedThreadPool , newFixedThreadPool , newScheduledThreadPool , newSingleThreadExecutor .

newCachedThreadPool

Papel : Crea un grupo de subprocesos que se pueden almacenar en caché, si la longitud de la agrupación de hebras supera las necesidades de procesamiento, la flexibilidad para recuperar subprocesos inactivos ( 缓存中已有 60 秒钟未被使用的线程), si no recuperable, entonces el nuevo hilo.

Características : grupo de subprocesos es infinito, la primera tarea se ha completado cuando la segunda tarea, el hilo utilizado para realizar la primera tarea será compleja, en lugar de cada vez que un nuevo hilo.

realización :

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
    final int index = i;
    try {
        Thread.sleep(index * 1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    cachedThreadPool.execute(new Runnable() {
        @Override
        public void run() {
            System.out.println(index);
        }
    });
}

newFixedThreadPool

Papel : crear un grupo de subprocesos de tamaño fijo, se puede controlar el número máximo de subprocesos simultáneos, el exceso de las discusiones van a esperar en la cola.

características :

  1. Si durante la ejecución antes del cierre debido a un fallo de cualquier hilo termina, entonces sustituirlo por un nuevo hilo para ejecutar tareas posteriores (si es necesario);
  2. Antes de que un hilo se cierra de forma explícita, siempre existirá el grupo de subprocesos.

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。

realización :

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
    final int index = i;
    fixedThreadPool.execute(new Runnable() {
        @Override
        public void run() {
            try {
                System.out.println(index);
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
}      

newScheduledThreadPool

Papel : crear un grupo de subprocesos de longitud fija para apoyar la ejecución de la tarea regular y periódica.

realización :

ScheduledExecutorService scheduledThreadPoo l= Executors.newScheduledThreadPool(3); 

scheduledThreadPool.schedule(newRunnable() { 
    @Override 
    public void run() {
        System.out.println("延迟三秒");
    }
}, 3, TimeUnit.SECONDS);

scheduledThreadPool.scheduleAtFixedRate(newRunnable(){ 
    @Override 
    public void run() {
        System.out.println("延迟 1 秒后每三秒执行一次");
    }
}, 1, 3, TimeUnit.SECONDS);

newSingleThreadExecutor

Papel : crear una piscina de un solo hilo de rosca, sólo lo utiliza para realizar la tarea sólo subprocesos de trabajo para asegurar que todas las tareas se realizan en un orden específico (FIFO, LIFO, prioridades).

Características : (o cuando se produce una excepción) en el hilo grupo de subprocesos puede reiniciar después de la muerte de un hilo para reemplazar el hilo original para continuar la ejecución.

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
    final int index = i;
    singleThreadExecutor.execute(new Runnable() {

        @Override
        public void run() {
            try {
                System.out.println(index);
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
}

Principio grupo de subprocesos

Papel : hilo de la multiplexación , controlar el número máximo de concurrente , gestión de hilos . grupo de subprocesos para hacer el trabajo es principalmente para controlar el número de hilos de ejecución, la tarea será colocado en el proceso de cola, y luego comenzar estas tareas después de la creación del hilo, si el número de hilos excede el número máximo es superior al número de hilos esperando en la cola, y otros hilos de ejecución se ha completado, y luego tomado de la cola para realizar la tarea.

multiplexación hilo

Cada uno tiene un método de inicio de la clase Thread (). Cuando se llama a iniciar el subproceso de inicio Java Virtual Machine llama al método de la clase run (). A continuación, el método de ejecución de clase () es llamar al método run () Ejecutable objeto. Podemos reescribir hereda la clase Thread, objeto Ejecutable sigue sumando se pasan las llamadas de ciclo más en su método start (). Esta es la realización del principio de la agrupación de hebras. El proceso cíclico con un acceso continuo a Ejecutable cola se implementa, antes de obtener la siguiente Ejecutable puede estar bloqueado.

La composición de la agrupación de hebras

Piscina General hilo se divide en los siguientes cuatro componentes:

  1. El hilo director de la piscina: para crear y gestionar el grupo de subprocesos;
  2. subprocesos de trabajo: Temas en la piscina;
  3. interfaz de tarea: cada tarea debe implementar la interfaz de programación de subprocesos de trabajo que se ejecutan;
  4. La cola de tareas: medios para almacenar las tareas que se procesa para proporcionar un mecanismo de amortiguación.

hilos de Java en la piscina se consigue marco Ejecutor, se utilizó el ejecutor, ejecutores, ExecutorService, ThreadPoolExecutor, rescatable y Futuro, FutureTask estas clases en el marco. configuración ThreadPoolExecutor como sigue:

/**
* @param corePoolSize 指定线程池中的线程数量
* @param maximumPoolSize 指定线程池中的最大线程数量
* @param keepAliveTime 当前线程池数量超过 corePoolSize 时,多余的空闲线程的存活时间
* @param unit keepAliveTime 的单位
* @param workQueue 任务队列,被提交但尚未被执行的任务
*/
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
    // threadFactory 线程工厂,用于创建线程,一般用默认的即可
    // handler 拒绝策略,当任务太多来不及处理,如何拒绝任务
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler);
}

política de rechazo

Papel : subproceso del grupo se agota, las nuevas tareas no pueden continuar sirviendo, al mismo tiempo que la cola de espera ya está lleno, no encajaría nueva tarea. Esta vez tenemos que rechazar la política del mecanismo razonable para hacer frente a este problema.

JDK estrategia de negación construida es el siguiente :

  1. AbortPolicy : tiro directo, que impiden la normalidad;
  2. CallerRunsPolicy : Mientras el grupo de subprocesos no está cerrada, la política directamente en el hilo de la persona que llama, ejecute la tarea actual se descarta. Obviamente, esto realmente no descarta tarea, sin embargo, el rendimiento de hilo de envío de trabajos es probable que sea un fuerte descenso;
  3. DiscardOldestPolicy : deseche la solicitud más antigua, que es una tarea que debe ejecutarse, y tratar de volver a presentar el trabajo actual;
  4. DiscardPolicy : Esta política no puede manejar la tarea descartados silenciosamente, sin ningún tratamiento. Si permite que la tarea no se encuentra, es el mejor tipo de programa.

Más estrategias de negación de construcción han alcanzado las interfaces RejectedExecutionHandler, si la estrategia anterior todavía no puede satisfacer las necesidades reales, puede extenderse interfaces de RejectedExecutionHandler.

proceso de trabajo de agrupación de hebras de Java

  1. Cuando el grupo de subprocesos acaba de crear, no hay hilo. cola de tareas se pasa como un parámetro. Sin embargo, incluso si la cola que tiene la tarea, el grupo de subprocesos no se ejecutará de forma inmediata;
  2. Cuando se llama al método execute () para agregar una tarea, el grupo de subprocesos hará la siguiente sentencia:

a) Si el número de subprocesos que se ejecutan menos de corePoolSize, a continuación, crear inmediatamente un hilo para ejecutar esta tarea;

b) Si el número de hilos en ejecución mayor que o igual corePoolSize, a continuación, esta tarea en una cola;

c) si esta vez la cola está llena, y el número de subprocesos que se ejecutan menos de maximumPoolSize, todavía se tienen que
crear un hilo no básicos para ejecutar esta tarea de inmediato;

d) Si la cola está llena, y el número de subprocesos que se ejecutan mayor que o igual a maximumPoolSize, el grupo de subprocesos arrojará una excepción RejectExecutionException.

  1. Cuando un hilo es para completar la tarea, se retira de una cola para realizar la tarea;
  2. Cuando un hilo es nada más que un cierto período de tiempo (KeepAliveTime), el grupo de subprocesos determinará si el número del hilo actualmente en ejecución es más que corePoolSize, a continuación, el hilo se detiene. Así que después de todas las tareas del grupo de subprocesos se ha completado, con el tiempo se reducirá al tamaño de corePoolSize.

Multihilo y concurrencia serie recomendada

Java multi-hilo 03-- cuál es el contexto hilo, cómo se programan los hilos

Ciclo de Vida de Java multi-hilo 02-- hilos y métodos comunes, que han dominado

Java multi-hilo 01-- la creación del hilo y la terminación, usted en varias maneras

Supongo que te gusta

Origin www.cnblogs.com/weechang/p/12527425.html
Recomendado
Clasificación