10086 al cliente la comprensión servicio de línea directa con multi-hilo grupo de subprocesos avanzado de Java


 Nietzsche dijo que los humanos no pueden entender lo que no se experimenta. Así que muchos de los conceptos no pueden ser obligados a entender y recordar, es necesario combinar el caso en la vida real.

Caso línea directa

 Para la comprensión de la agrupación de hebras puede compararse con el usuario para manejar el negocio de las llamadas de servicio al cliente, los operadores de servicio al cliente suponen un descanso de 500 personas, los 500 usuarios existentes son uno a uno con el cliente, a continuación, los primeros 501 usuarios que es Bob Esponja escuchará de voz en espera: Bob Esponja sólo se puede esperar, si hay más de 500 usuarios tienen un cuelgue, Bob Esponja puede conectarse correctamente a una persona viva; "hola descansar ahora ocupados ...!"
 llamadas de teléfono del usuario para el servicio al cliente para todos es una tarea, y cada cliente puede completar una serie de tareas, en lugar de sólo 500 tareas, tales como el acceso del cliente a 100 llamadas por día, entonces todo el fondo de servicio al cliente se ha completado 50.000 tareas;

Aquí Insertar imagen Descripción

Analogía: el servicio al cliente puede ser visto como el grupo de subprocesos de fondo, 500 de servicio al cliente puede ser visto como 500 hilos, 500 usuarios es la tarea, y el teléfono se enciende para llevar a cabo esto es el hilo, el usuario primero 501 llame a la línea de servicio al cliente bastante en 501 tareas, más que el hilo máxima puede poner en cola, pero tienen que esperar hasta que otro hilo para completar antes de comenzar, lo que permite la reutilización de la rosca;

Esta analogía casos reales, se pueden encontrar los siguientes problemas:

  • Un hilo es un valioso recursos de memoria, un solo hilo que representa el espacio de 1 MB. Conducir fácilmente a la sobre-asignación de desbordamiento de memoria.
  • Frecuentes crear y destruir hilos aumentará los recursos de frecuencias de recuperación de la máquina virtual de arriba, lo que resulta en el programa de la degradación del rendimiento

La introducción del grupo de subprocesos

1. El concepto de hilos

El siguiente es un extracto de Baidu Enciclopedia

 grupo de subprocesos es una forma de procesamiento multihilo se añadirán las tareas de procesamiento a la cola, y luego iniciar estas tareas de forma automática cuando se crea un hilo. subprocesos de grupo de hilos son hilos de fondo. Cada hilo utiliza el tamaño de pila predeterminado de ejecución de prioridad por defecto, y en la unidad multi-roscado. Si un hilo en código administrado está inactivo (por ejemplo, está a la espera de un evento), a continuación, insertar el hilo grupo de subprocesos a todos los demás procesador auxiliar para mantenerse ocupado. Si todas las discusiones grupo de subprocesos siempre están ocupados, pero la cola contiene trabajo pendiente, la agrupación de hebras crea otro subproceso de trabajo después de un período de tiempo, pero el número de hilos nunca excederá el máximo. Más de la rosca máxima puede poner en cola, pero tienen que esperar hasta que otro hilo para completar antes de comenzar.

2. El papel del grupo de subprocesos:

  • Las tareas serán sometidos a la agrupación de hebras. Asignado por el hilo grupo de subprocesos, ejecute la tarea, y volver a utilizar el hilo después del final de la tarea actual.
  • hilos recipiente. Se puede configurar para limitar el número de hilos asignados.
  • El objeto hilo pre-creado en la piscina, ambos con un objeto hilo grupo de subprocesos.
  • Evitar la creación de hilos frecuente y destruyendo.

Conseguir el grupo de subprocesos

1. Las clases de grupo de subprocesos comunes e interfaces

  • Ejecutor: grupo de subprocesos de interfaz de nivel superior
método descripción
void ejecutar (comando Ejecutable) Ejecuta el comando dado en algún momento futuro.
  • ExecutorService:
     las interfaces heredadas grupo de subprocesos, el Ejecutor, y aumentar y optimizar el comportamiento de alguna de las interfaces de los padres, el código de tarea puede ser presentada por presentar (tarea Ejecutable).
método descripción
Futuro presentar (tarea que se puede llamar) El valor devuelto enviar tareas a realizar, en nombre de la tarea y volver espera de los resultados de Futuro.
Futuro <?> Submit (tarea Ejecutable) Enviar un tareas ejecutables realizadas, y volvió diciendo que el futuro de la misión.
Futuro presentar (tarea Ejecutable, T resultado) Enviado realizar una tarea que se puede ejecutar, y no un retorno de esa tarea
  • clase ejecutores de fábrica:

 Se puede obtener por el método siguiente un número fijo de hilos de grupo de subprocesos. El número de hilos de la piscina hilo parámetro que se

método descripción
estática ExecutorService newFixedThreadPool (nThreads INT) Crear un grupo de subprocesos, el hilo grupo de subprocesos para reutilizar un número fijo de carreras de una cola sin límites compartido.

Crear una forma

//线程池引用 ===> Executors工具类创建线程
        ExecutorService executorService = Executors.newFixedThreadPool(2);

 También puede newCachedThreadPool () Obtiene el número de grupo de subprocesos dinámico, si no, entonces crea automáticamente una nueva, sin límite superior;

JAVAAPI:

Crea un grupo de subprocesos que crea nuevos temas, según sea necesario, pero cuando esté disponible va a volver a utilizar hilos previamente construidos. Estas piscinas generalmente mejorarán la ejecución de muchas tareas asíncronas de corta duración del programa. Las llamadas a ejecutar reutilizará hilos construidos previamente (si está disponible). Si hay hilo, se crea un nuevo hilo y se añade a la piscina. No utilice un 60-segundo hilo se dará por terminado y se elimina de la memoria caché. Por lo tanto, la piscina permanecerá inactivo durante mucho tiempo no consume recursos. Tenga en cuenta, pero se puede crear un grupo (por ejemplo, los parámetros de tiempo de espera) de diferentes detalles con propiedades similares utilizando el constructor ThreadPoolExecutor.

método descripción
estática ExecutorService newCachedThreadPool () Crea un grupo de subprocesos que crea nuevos temas, según sea necesario, pero cuando esté disponible va a volver a utilizar hilos previamente construidos.

2. Caso Código

 Una tarea actual, implementar Ejecutable, ciclo de impresión 5 veces, hay una piscina-hilo transversal executorServicepara realizar la tarea, respectivamente, y el número máximo de hilos en el grupo de subprocesos es 2;

public class TestThreadPool {
    public static void main(String[] args){

        //线程池引用 =  Executors工具类创建线程
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        Runnable runnable = new MyTask();
        executorService.submit(runnable);
    }
}
class MyTask implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i <5; i++) {
            System.out.println(Thread.currentThread().getName()+" MyTask: "+i);
        }
    }
}

Resultado de la impresión:
Aquí Insertar imagen Descripción
Si una tarea se presenta varias veces? Por ejemplo, la tarea presentada al grupo de subproceso del grupo de subprocesos es mayor que el límite máximo, se le
enhebrar la multiplexación suceda?
Método de prueba:

//线程池引用 =  Executors工具类创建线程
 ExecutorService executorService = Executors.newFixedThreadPool(2);
 Runnable runnable = new MyTask();
 executorService.submit(runnable);
 executorService.submit(runnable);
 executorService.submit(runnable);

 Al parecer hay dos hilos ha presentado tres tareas, por lo tanto, tiene que haber un hilo para ser multiplexados.

Resultado de la impresión:
Aquí Insertar imagen Descripción
 a partir de los resultados de impresión, el hilo 1 se multiplexa dos veces, para evitar la creación de hilos frecuente y destrucción, para lograr el propósito de la optimización;

Interfaz invocable

1. Descripción del concepto

 Descrito en lo anterior Executortiempo, las listas de los siguientes tres métodos, un método en el que el primer parámetro esCallable

método descripción
Futuro presentar (tarea que se puede llamar) El valor devuelto enviar tareas a realizar, en nombre de la tarea y volver espera de los resultados de Futuro.
Futuro <?> Submit (tarea Ejecutable) Enviar un tareas ejecutables realizadas, y volvió diciendo que el futuro de la misión.
Futuro presentar (tarea Ejecutable, T resultado) Enviado realizar una tarea que se puede ejecutar, y no un retorno de esa tarea
@FunctionalInterface
public interface Callable<V>

 Devuelve un resultado y puede conducir a la tarea inusual. Conseguido por un método no definir un solo parámetro llamado llamada.
interfaz invocable es similar a Ejecutable, porque son su instancia de clase puede ser ejecutado por otro diseño de rosca. Sin embargo, un Ejecutable no devuelve un resultado, no se puede lanzar excepciones siendo examinados.

2. Los escenarios

 Si tenemos que calcular 1+2+3+......+1000000los resultados, un proceso que tenemos que entregar a varios subprocesos para ejecutar, respectivamente, Thread1antes de ejecutar los 100.000 y figuras, como Thread2 realizar 100.000 a 200.000 suma de los números ... pero que implica un problema de que Thread1la ejecución resultado de la ejecución tiene que volver, o Thread2no procede de acuerdo con el resultado de 1, obviamente, no se puede utilizar en este momento implementa la clase Runnableinterfaces de cobertura rundel método de resolver, ya que el recorrido de retorno es nulo;

class MyTask implements Runnable{
    @Override
    public void run() {
      //1+2+...+100000
    }
}

Se utiliza Callablecomo su característica más importante es: devolver los resultados y puede causar tarea inusual.
Aquí Insertar imagen Descripción

3. Métodos

método descripción
llamada V () El cálculo de un resultado, si usted no puede hacer eso, va a lanzar una excepción.
  • JDK5 añadió, similar a la interfaz Ejecutable, después de la implementación representa una tarea hilo.
  • Exigible tiene un valor de retorno genérica, se puede declarar excepciones.
public interface Callable<V>{
	public V call() throw Exception;
}

4. La aplicación del método

public class TestCallable {
    public static void main(String[] args){
        //创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        Callable task = new Task();
        executorService.submit(task);
        executorService.submit(task);
        executorService.submit(task);
    }
}
class Task implements Callable<String>{
    @Override
    public String call() throws Exception {
        for (int i = 0; i <5 ; i++) {
            System.out.println(Thread.currentThread().getName()+" : "+i);
        }
        return null;
    }
}

Resultado de la impresión:
Aquí Insertar imagen Descripción
 Es evidente que hay dos hilos ha presentado tres tareas, por lo tanto, el hilo 2 multiplex.

interfaces de futuros

1. introducción

Y EMSP; vamos a empezar a introducir el caso: el cálculo 1+2+3+......+1000000resultado de este proceso tenemos que entregar a varios subprocesos para ejecutar respectivamente, invocable puede devolver el tipo, pero ¿cómo una suma de los diversos hilos de la devolución escribirla? necesidad futura interfaz para introducir aquí, el objeto que encapsula call()el valor de retorno

JAVAAPI:

Resultados cálculos un futuro. Proporciona un método para comprobar el cálculo se ha completado, a la espera de su finalización, y recupera los resultados. Los resultados sólo se pueden utilizar después de que el método de cálculo obtener recuperada, si es necesario, el bloque hasta que esté listo. Cancel realizado por el método de cancelar. Proporcionar otra manera de determinar si una tarea se ha completado con normalidad o se cancela. Después de completar el cálculo, el cálculo no se puede cancelar. Si desea utilizar futuro, por lo que de manera irrevocable, pero no proporciona un resultado útil, se puede declarar Futuro <?> Mesa Tipo y vuelve nula como la base de los resultados de la tarea.

2. Métodos

método descripción
boolean cancelar (boolean mayInterruptIfRunning) Intentar cancelar la ejecución de esta tarea.
V get () cálculos de espera se han completado, y luego recupera el resultado.
V get (largo tiempo de espera, la unidad de TimeUnit) Si usted tiene que esperar por un tiempo determinado para completar el cálculo de un máximo y luego recupera el resultado (si está disponible).
boolean isCancelled () Si esta tarea se canceló antes de que finalice correctamente, devuelve cierto.
isDone boolean () Devuelve true si esta tarea completada.

3. Resolver el problema de sub-tareas realizadas 1 + 2 + ... + 100

public class TestCallable {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		System.out.println("程序开始");
		//创建线程池
		ExecutorService es = Executors.newFixedThreadPool(3);
		
		Callable<Integer> task1 = new MyTask1();
		Callable<Integer> task2 = new MyTask2();
		//接收两个任务的返回值
		Future<Integer> f1 = es.submit(task1);
		Future<Integer> f2 = es.submit(task2);
		//检索计算结果并返回给变量
		Integer result1 = f1.get();//无限期等待
		Integer result2 = f2.get();//无限期等待
		//输出结果
		System.out.println("result1:"+result1 + " + result2:"+result2 +" = " +(result1+result2));		
	}
}
//线程1计算1+2+....+50
class MyTask1 implements Callable<Integer>{
	@Override
	public Integer call() throws Exception {
	  	Thread.sleep(5000);
		Integer sum = 0;
		for (int i = 1; i <= 50; i++) {
			sum += i;
		}
		return sum;
	}
}
//线程2计算51—+52+.....+100
class MyTask2 implements Callable<Integer>{
	@Override
	public Integer call() throws Exception {
	    Thread.sleep(5000);
		Integer sum = 0;
		for (int i = 51; i <= 100; i++) {
			sum += i;
		}
		return sum;
	}
}

resultados de impresión (esto es una imagen en movimiento):
Aquí Insertar imagen Descripción
 A partir de los resultados de impresión, V get()se bloquea en forma de esperar asíncrono futuro (multi-threaded) procesar resultado ( call()valor de retorno); popular, aquí vamos dos hilos para dormir durante cinco segundo, por lo que en el curso de dos hilos en el período de espera, V get()se bloquea en forma de hilos de espera ha terminado, después con el fin de obtener Futureel valor de retorno;


 De hecho, ha habido muy buenos amigos - sensación distribuye
Aquí Insertar imagen Descripción

Publicado 85 artículos originales · ganado elogios 196 · vistas 130 000 +

Supongo que te gusta

Origin blog.csdn.net/qq_44717317/article/details/104928731
Recomendado
Clasificación