El paquete java.util.concurrent proporciona clases sobre operaciones multiproceso. Los de uso común son EjecutorService y sus clases de implementación (como Threadpoolexecutor, etc.), ejecutores, ejecutores, futuro, llamables, etc.
1. ExecutorService (heredado del ejecutor) Interfaz: proporciona algunos métodos de operación múltiples asíncronos, como Execute (), Subt (), shutdown (), shutdownNow (), etc.
2. Interfaz del ejecutor: ejecute la tarea enviada (hilo), con solo un método ejecutado (runnable a)
2. Clase de ejecutores: proporciona algunos métodos de fábrica y algunos métodos públicos para operar subclases de ejecutores y ThreadFactory, etc., como Newxxx (), xxxThreadFactory (), etc.
3. Interfaz de Futrue: representa el resultado de la ejecución de subprocesos, proporciona métodos para obtener el resultado de la ejecución de subprocesos y cancelar los subprocesos, como get (), cancle (), etc.
4. Interfaz llamable: JDK1.5 proporciona el hilo con el valor de retorno para ejecutar una nueva interfaz
Hacer registros simples de la comprensión de EjecutorService y el futuro
Código:
clase pública Main {private static int count = 0; public static void main (string [] args) {list <future> resultList = new LinkedList <> (); /*** Ejecutores.newCachedThreadPool () Crear un grupo de caché de subprocesos. Si el hilo no se usa en 60S, el hilo se detendrá y se eliminará del grupo de caché* Ejecutores. NewsCheduledThreadPool () Cree un grupo de subprocesos con capacidad fija, y los subprocesos dentro de Ejecutación de Ejecutación de programación establecida* Ejecutores. NewFixedThreadPool () tiene un grupo de hilo de hilo con capacidad fija* Ejecutores. Ejecutores. Thread*/ EjecutorService EjecutorService = Ejecutors.NewCachedThreadPool (); for (int i = 0; i <10; i ++) {futuro futuro = ExecutorService.SubMit (new Callable <String> () {@Override public String Call () {try {System.out.println (thread.CurrentThread (). Main.Count; resultList.Add (futuro); } EjecutorService.shutdown (); para (futuro futuro: resultList) {try {system.out.println (futuro.get () + ".. es terminado ..."); } catch (InterruptedException e) {E.PrintStackTrace (); } catch (ExecutionException e) {E.PrintStackTrace (); }} System.out.println ("End de hilo principal ..."); }}Producción:
Pool-1-Thread-1pool-1-Thread-2pool-1-Thread-3pool-1-Thread-4pool-1-Thread-5pool-1-thread-6pool-1-thread-7pool-1-thread-8pool-1-thread-9pool-1-thread-10pool-1-thread-thread..start Count: ... 0pool-1-Thread-2..Start Count: ... 0pool-1-thart-thart-thart-thart- Recuento principal: ... 1pool-1-thread-2..End Recuento principal: ... 1pool-1-Thread-1..Ed Recuento principal: ... 1Pool-1-Thread-3..Ed Recuento principal: ... 1Pool-1-Thread-2..End Count: ... 1Pool-1-Thread-1..End Main Count: ... 1Pool-1-thread-3..End Main Count: ... 2Pool-1-thread-1..Is de ... sobre ... Pool-1-Thread-4..Star Recuento principal: ... 2Pool-1-Thread-3.. se acabó ... Pool-1-Thread-4..Ed Contejo principal: ... 3Pool-1-4 .. se over count:...4pool-1-thread-6..end Main count:...4pool-1-thread-6..end Main count:...4pool-1-thread-6..end Main count:...4pool-1-thread-6..end Main count:...4pool-1-thread-6..end Main count:...5pool-1-thread-6..is over...pool-1-thread-7..start Main count:...5pool-1-thread-7..end Main Conteo: ... 6pool-1-Thread-7.. se acabó ... Pool-1-Thread-8..Star el recuento principal: ... 6pool-1-thread-8..End Main Count: ... 7pool-1-thread-8..Is Over ... Pool-1-thread-9..Star el recuento principal: ... 7Pool-1-thread-9..End Count: ... 8pool-1-thread-9..Is Over ... Pool-1-thread-10 .. Conteo: ... 7pool-1-Thread-9..En Conteo principal: ... 8pool-1-Thread-9.. se acabó ... Pool-1-Thread-10..Star el conteo principal: ... 8pool-1-9 .. se trata de ... Pool-1-thread-10..Start Rolte principal: ... 8Pool-1-thread-10..Ed Count: ... 9Pool-1-thread-10..Is Over ... en el hilo principal ...
La consola imprime el resultado de salida anterior después de esperar 5 segundos. La razón es que cuando todos los hilos comienzan, es una operación concurrente y esperará 5 segundos. Entonces, en general, parece que solo esperó 5 segundos. Esta es una operación concurrente.
Resumir:
1. La diferencia entre el método Execute () y el método Subt () proporcionado por EjecutorService:
a. El método Execute () solo acepta instancias de tipo ejecutable, por lo que no puede obtener el valor de retorno, ni puede obtener dinámicamente la situación de ejecución del hilo.
b. El método Subt () acepta instancias ejecutables y llamables y devolverá la instancia futura. El método get () de la instancia futura puede obtener el valor de retorno de ejecución del hilo y lanzar excepciones de ejecución de hilo. Entonces, si desea obtener el resultado devuelto por la ejecución del subproceso y poder manejar posibles excepciones durante la ejecución de subprocesos, o si desea cancelar la ejecución de subprocesos en el medio, puede usar el método EnvIt ()
2. A través de la salida, puede ver que el método principal (hilo principal) termina después de que todos los subprocesos hayan completado la ejecución. La razón:
a. Obtenga la instancia futura a través del método Subt () y obtenga el resultado de retorno de hilo a través del método get () de la instancia futura. El método get () de la instancia futura esperará a que el hilo se ejecute antes de regresar, por lo que el método principal esperará a que terminen todos los hilos infantiles antes de finalizar
b. Si se elimina el bucle para el bucle marcado con rojo arriba, el método principal (hilo principal) terminará temprano sin esperar a que terminen todos los hilos infantiles
Reponer:
1. Cuando múltiples hilos se ejecutan simultáneamente, si se produce una excepción en uno de los subprocesos y no se procesa, el hilo detendrá automáticamente la ejecución, pero los otros hilos aún se ejecutarán normalmente. Esta es la razón por la cual Tomcat puede continuar brindando servicios cuando se produce una excepción en la solicitud de Tomcat.
2. Tomcat proporciona una piscina de hilo y una piscina que espera. Cada solicitud reiniciará un nuevo hilo para procesar la solicitud. Si los hilos en la piscina de hilos se usan, se colocarán en la piscina de espera y esperarán. Cuando se libera un hilo nuevamente en el grupo de subprocesos, se asignará un hilo para procesar las solicitudes en el grupo de espera.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.