1. Ejecutores
La clase de ejecutores puede considerarse como una "clase de herramientas". Citando la introducción en la API JDK1.6:
Métodos de fábrica y prácticos del ejecutor, eCecomorservice, ProchuledExecutorService, ThreadFactory y clases llamables definidas en este paquete. Esta clase admite varios métodos:
(1) Cree y devuelva el método para configurar el servicio de ejecutor con cadenas de configuración comúnmente utilizadas.
(2) Cree y devuelva el método para configurar el ProgramedExecutorService con cadenas de configuración comúnmente utilizadas.
(3) Cree y devuelva el método EjecutorService "envuelto", que deshabilita la reconfiguración al hacer que los métodos específicos de implementación sean inaccesibles.
(4) Crear y devolver un método de ThreadFactory, que puede establecer el hilo recién creado en un estado conocido.
(5) Cree y devuelva un método llamable no cerrado, para que pueda usarse en métodos de ejecución que requieren invocación.
A través de esta clase, puede obtener múltiples instancias de grupos de subprocesos, como llamar a NewsingLethreadExecutor () para obtener un servicio de ejecutores de un solo hilo, llamando a NewfixedThreadPool () para obtener un servicio de ejecutores de un grupo de hilos de tamaño fijo, etc. Hay más cosas que puede hacer cuando obtiene el servicio ejecutor. Lo más fácil es usarlo para ejecutar objetos ejecutables, o puede ejecutar algunos objetos que implementan una vez llamable <t>. No hay valor de retorno utilizando el método Start () de Thread. Si el método ejecutado por el hilo tiene un valor de retorno, sería mejor usar ExecutorService. Puede elegir enviar (), invokeall () o invokeany () y seleccionar el método apropiado de acuerdo con la situación específica.
Algunos de los métodos proporcionados en esta clase son:
1.1 Public Static Ejecutorservice NewCachedThreadPool ()
Cree un grupo de hilos que cree nuevos hilos según sea necesario, pero los reutilizará cuando estén disponibles hilos previamente construidos. Estos grupos de subprocesos generalmente mejoran el rendimiento del programa para programas que realizan muchas tareas asincrónicas a corto plazo.
1.2 Public Static EjecutorService NewFixedThreadPool (int nthreads)
Cree un grupo de subprocesos con un número fijo de hilos reutilizables para ejecutar estos hilos en una cola sin límites compartida.
1.3 Public Static EjecutorService NewsingLethreadExecutor ()
Cree un ejecutor que use un solo hilo de trabajador para ejecutar el hilo en una cola ilimitada.
Los tres métodos se pueden usar con instancias de interfaz ThreadFactory. Y devuelva una instancia de la interfaz EjecutorService.
2. Interface ThreadFactory
Cree nuevos objetos de hilo según sea necesario. El uso de fábricas de hilos ya no requiere una escritura manual de nuevas llamadas de subprocesos, lo que permite que las aplicaciones usen subclases de subprocesos especiales, propiedades, etc.
La implementación más simple de esta interfaz es:
class SimpleThreadFactory implementa ThreadFactory {public Thread NewThread (runnable r) {return new Thread (r); }} 3. Interface EjecutorService
Esta interfaz proporciona un método para administrar la terminación.
4. Cree un hilo de inicio de grupo de subprocesos estándar
4.1 Proporcionar un hilo simple que implementa la interfaz ejecutable
Mythread.java
paquete com.zj.concurrency.executors; Public Class MyThread implementos runnables {private int count = 1, número; public mythread (int num) {number = num; System.out.println ("Crear hilo-" + número); } public void run () {while (true) {System.out.println ("Thread-" + Number + "Run" + Count + "Time (s)"); if (++ count == 3) return; }}} Este hilo imprimirá la información de creación y ejecución correspondiente.
4.2 Inicie el hilo con CachedThreadPool
Cachedthreadpool.java
paquete com.zj.concurrency.executors; import java.util.concurrent.executorservice; import java.util.concurrent.executors; clase pública CachedThreadPool {public static void main (String [] args) {ExecutorService exec = Executors.NewCachedThreadPool (); para (int i = 0; i <5; i ++) exec.execute (nuevo mythread (i)); exec.shutdown (); }} resultado:
Cree thread-0create thread-1create thread-2create thread-3thread-0 ejecutar 1 tiempo (s) thread-0 ejecutar 2 veces (s) hilo-1 ejecutar 1 tiempo (s) hilo-1 ejecutar 2 veces (s) hilo-2 ejecutar 1 tiempo (s) hilo-2 ejecutar 2 tiempo (s) cree hilo-4thread-4 ejecutar 1 tiempo (s) hilo de hilo-4 ejecutar 2 tiempo (s) hilo de hilo 3 tiempo 1 tiempo (s) hilo-3 run-3)
4.3 Inicio de hilo Uso de FixedThreadPool
FijoThreadPool.javapackage com.zj.concurrency.executors; import java.util.concurrent.executorservice; import java.util.concurrent.executors; clase pública FIJATIONTHREADPOOL {public static void main (String [] args) {ExecutorService exec = Ejecutors.NewFixedThreadPool (2); para (int i = 0; i <5; i ++) exec.execute (nuevo mythread (i)); exec.shutdown (); }} resultado:
Create Thread-0Create Thread-1Create Thread-2Create Thread-3Create Thread-4Thread-0 run 1 time(s)Thread-0 run 2 time(s)Thread-2 run 1 time(s)Thread-2 run 2 time(s)Thread-3 run 1 time(s)Thread-3 run 2 time(s)Thread-4 run 1 time(s)Thread-4 run 2 time(s)Thread-1 run 1 time(s)Thread-1 run 2 time(s)
4.4 Iniciar hilo usando SinglethreadExecutor
Singlethreadexecutor.java
paquete com.zj.concurrency.executors; import java.util.concurrent.executorservice; import java.util.concurrent.executors; public class SingleThreadExecutor {public static void main (String [] args) {ExecutorService exec = Ejecutors.NewsingLethreadExecutor (); para (int i = 0; i <5; i ++) exec.execute (nuevo mythread (i)); exec.shutdown (); }} resultado:
Create Thread-0Create Thread-1Create Thread-2Create Thread-3Create Thread-4Thread-0 run 1 time(s)Thread-0 run 2 time(s)Thread-1 run 1 time(s)Thread-1 run 2 time(s)Thread-2 run 1 time(s)Thread-2 run 2 time(s)Thread-3 run 1 time(s)Thread-3 run 2 time(s)Thread-4 run 1 time(s)Thread-4 run 2 time(s)
5. Cooperar con el uso de la interfaz ThreadFactory
Estamos tratando de agregar la configuración del atributo de demonio y prioridad al hilo.
5.1 Establecer propiedades de subproceso de fondo
DaemonthreadFactory.java
paquete com.zj.concurrency.executors.factory; import java.util.concurrent.threadfactory; public class DaemonThreadFactory implementa ThreadFactory {public Thread NewThread (runnable r) {Thread t = new Thread (r); T.SetDaemon (verdadero); regresar t; }}
5.2 Establecer atributos prioritarios
MaxpriorityThreadFactory.java
paquete com.zj.concurrency.executors.factory; import java.util.concurrent.threadfactory; public class MaxPriorityThreadFactory implementa ThreadFactory {public Thread NewThread (runnable r) {Thread t = new Thread (r); T.SetPriority (Thread.max_priority); regresar t; }} Prioridad mínima miniminación de factory.java
paquete com.zj.concurrency.executors.factory; import java.util.concurrent.threadfactory; public class minpriorityThreadFactory implementa ThreadFactory {public Thread NewThread (runnable r) {Thread t = new Thread (r); T.SetPriority (hilo.min_priority); regresar t; }}
5.3 Iniciar hilo con configuración de atributos
ExecFromFactory.java
paquete com.zj.concurrency.executors; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import com.zj.concurrency.executors.factory.daemonthactory; import com.zj.concurrency.executors.factory.maxprioritythreadtyThactory; com.zj.concurrency.executors.factory.minpriorityThreadFactory; public class ExecFromFactory {public static void main (String [] args) lanza la excepción {ExecutorService defaultExec = Executors.newCachedThreadPool (); EjecutorService daemonexec = ejecutors .newCachedThreadPool (newemonThreadFactory ()); EjecutorService maxpriorityExec = Ejecutors .NewCachedThreadPool (new MaxPriorityThreadFactory ()); EjecutorService minpriorityExec = Ejecutores .NewCachedThreadPool (new MinpriorityThreadFactory ()); para (int i = 0; i <10; i ++) daemonexec.execute (nuevo mythread (i)); para (int i = 10; i <20; i ++) if (i == 10) maxpriorityExec.execute (nuevo mythread (i)); else if (i == 11) minpriorityExec.execute (nuevo mythread (i)); else DefaultExec.Execute (nuevo MyThread (i)); }} resultado:
Create Thread-0Create Thread-1Create Thread-2Create Thread-3Thread-0 run 1 time(s)Thread-0 run 2 time(s)Thread-1 run 1 time(s)Thread-1 run 2 time(s)Thread-2 run 1 time(s)Thread-2 run 2 time(s)Create Thread-4Thread-4 run 1 time(s)Thread-4 run 2 time(s)Create Thread-5Thread-5 run 1 time(s)Thread-5 run 2 time(s)Create Thread-6Create Thread-7Thread-7 run 1 time(s)Thread-7 run 2 time(s)Create Thread-8Thread-8 run 1 time(s)Thread-8 run 2 time(s)Create Thread-9Create Thread-10Thread-10 run 1 time(s)Thread-10 run 2 time(s)Create Thread-11Thread-9 run 1 time(s)Thread-9 run 2 time(s)Thread-6 run 1 time(s)Thread-6 run 2 tiempo (s) hilo-3 ejecutar 1 tiempo (s) hilo-3 ejecutar 2 veces (s) crear hilt-12create hift-13create hilo-14thread-12 ejecutar 1 tiempo (s) hilo-12 ejecutar 2 veces (s) hilo-13 ejecutar 1 tiempo (s) hilt-13 ejecutar 2 tiempo (s) create hilt-15thread-15 run 1 tiempo (s) hilt-15 run 2 veces (s) crea hilo 2 hilo 16 tiempo streb-1) time(s)Create Thread-17Create Thread-18Create Thread-19Thread-14 run 1 time(s)Thread-14 run 2 time(s)Thread-17 run 1 time(s)Thread-17 run 2 time(s)Thread-18 run 1 time(s)Thread-18 run 2 time(s)Thread-19 run 1 time(s)Thread-19 run 2 time(s)Thread-11 run 1 time(s)Thread-11 run 2 time(s)