Modo de hilo por messaje (este trabajo se le deja)
Cuando estás muy ocupado, hay un mensajero abajo de la empresa, por lo que confía a tu colega que te ayude a obtener tu mensajero para que puedas continuar haciendo tu trabajo.
En el modo de hilo por messaje, el extremo delegado del mensaje y el extremo de ejecución son hilos diferentes. El extremo delegado del mensaje le indicará al hilo de extremo de ejecución, y este trabajo se le entregará.
Clase de anfitrión:
La clase que crea un hilo para las solicitudes es principalmente abriendo un nuevo hilo, llamando al mango de ayudante y pasando el texto para imprimir.
public class Host {private Final Helper helper = new Helper (); Public void Request (final int count, final char c) {System.out.println ("Solicitar inicio"); new Thread () {public void run () {helper.handle (cuenta, c);}}. Start (); System.println ("Solicitar final");}}}}}}}}}}}}}}}}}Clase de ayudante:
Proporciona función de visualización de caracteres, el método lento simula el tiempo de impresión
public class aelper {public void many (int count, char c) {system.out.println ("handle método inicio"); for (int i = 0; i <count; i ++) {lentamente (); system.print (c);} system.out.println (""); system.printlnn ("manejar el método end");} private vloid () {tree lloid () {) {Thread.sleep (100);} Catch (InterruptedException e) {// TODO Gennorated Catch BLOCKE.PRINTSTACKTRACE ();}}}Clase principal:
Cree una instancia de host y llame al método de solicitud
public static void main (string [] args) {System.out.println ("Main Begin"); host host = new Host (); host.request (10, 'a'); host.request (20, 'b'); host.request (30, 'c'); system.out.println ("final principal");}Resultados de la prueba:
comienzo principal
El método de solicitud ha comenzado
El final del método de solicitud
El método de solicitud ha comenzado
El final del método de solicitud
El método de solicitud ha comenzado
El final del método de solicitud
extremo principal
Iniciar el método de manejo
Iniciar el método de manejo
Iniciar el método de manejo
Bacbacbacbacbacbacbacba
Método de finalización del mango
Cbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbb
Método de finalización del mango
Cccccccccccc
Método de finalización del mango
Desde los resultados de la operación, podemos ver que el método de solicitud no espera a que el método del identificador se ejecute antes de la ejecución, pero llama al método de identificación y regresa al método de solicitud hasta que finalice la ejecución. Por lo tanto, es equivalente al método de solicitud que pasa el trabajo de imprimir un cierto número de caracteres que se realizarán en el método de identificación, y el método de solicitud puede ejecutar otras declaraciones en el método estúpido sin esperar a que el método del identificador se complete. Esto también nos dice que cuando algún trabajo requiere mucho tiempo, se pueden iniciar nuevos hilos en este modo para realizar el procesamiento. Este modo se puede aplicar al servidor, lo que puede reducir el tiempo de respuesta del servidor.
Explique el proceso y el hilo:
La mayor diferencia entre hilos y procesos es si la memoria coexiste.
Cada proceso tiene su propio espacio de memoria independiente. Un proceso no puede leer y escribir la memoria de otros procesos sin autorización. Dado que el espacio de memoria de los procesos es independiente entre sí, un proceso no necesita preocuparse por ser destruido por otros procesos.
Los hilos pueden coexistir. Un hilo escribe contenido en la instancia, y otros hilos pueden leer el contenido de la instancia. Dado que múltiples hilos pueden acceder a la misma instancia, debemos asegurarnos de que realice mutex correctamente.
Optimización del diseño del host:
1. Diseñe la clase de host usando la interfaz ThreadFactory en el paquete java.util.concurrent
public class Host {public void request (final int count, final char c) {System.out.println ("El método de solicitud inicia"); ThreadFactory.Newthread (new runnable () {@OverridePublic Void run () {// toDO Auto Generated Method stubHelPer.handle (Count, c);}). Start.;;;;;;; System.out. termina ");}}Objeto de instanciación del host correspondiente:
Host host = nuevo host (ejecutors.defaultThreadFactory ());
La ventaja de este diseño es que el código de instancia original creado con nuevo depende de la clase java.lang.thread, y no puede controlar la parte del hilo de creación, y es menos reutilizable. Si ThreadFactory se usa para guardar los objetos de la clase correspondiente y llamar al método NewThread para crear un nuevo hilo, se realiza la creación del hilo. Esto ya no depende de la clase de subprocesos, sino que depende del objeto de hilo de hilo aprobado en el constructor, lo que implementa los detalles de controlar la creación de hilos.
Rediseñe la clase de host usando la interfaz java.util.concurrent.executor:
La interfaz ThreadFactory anterior oculta los detalles de la creación de hilos, pero no oculta las operaciones de creación de hilos. Si se utiliza la interfaz del Ejecutor, las operaciones de creación de hilos también se ocultarán.
public class Host{private final Helper helper = new Helper();private final Executor executor;public Host(Executor executor){this.executor = executor;}public void request(final int count,final char c){System.out.println("request method has started");executor.execute(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubhelper.handle (count, c);}}); system.out.println ("End de método de solicitud");}}Creado usando java.util.concurrent.scheduledExecutorService Clase, que puede implementar la operación programada
public class Host {private Final Helper Helper = new Helper (); privado final ProchuleDExecutorService ProchuleDExecutorService; public Host (ProgramedExeCutorService ProchuleDExecutorService) {this.scheduledExedExeCuTorService = scheduleDExeCutorService;} Solicitud pública (Final INTO CHAR C) iniciado "); ProchuleDExeCuTorService.schedule (new runnable () {@OverridePublic Void run () {// TODO Auto Generado Método stubHelper.handle (count, c);}}, 3l, TimeUnit.SeConds); System.Println (" Solicitar el método End ");}}}}}}}}}}}}}}}}}}Pruebe la entrada de la función principal:
ProgramedExeCuTorService ProchuleDExeCuTorService = Executors.NeWSChedulEdThreadPool (5); host host = new Host (ProchuleDExeCuTorService); try {host.request (10, 'a'); host.request (20, 'b'); host.request (30, 'c');} Catch (excepción e) blocke.printstackTrace ();} Finalmente {ProgramedExecutorService.shutdown (); System.out.println ("End principal");}Resumir
El rol del cliente llama al método de solicitud del rol de host, y el procesamiento real de la solicitud se entrega al identificador de ayuda para su ejecución. Sin embargo, si el cliente llama al método de identificación directamente desde la solicitud, no se puede devolver desde el método de identificación hasta que termine la operación real. Esto reducirá el rendimiento de respuesta de la solicitud. Por lo tanto, el rol de host iniciará un nuevo hilo utilizado para procesar la solicitud del rol del cliente y dejará que el subproceso llame al mango, para que el hilo que realice la solicitud pueda regresar inmediatamente del mango. Este es el modo de hilo por mesaje.