1 razones para introducir piscinas de hilos
Dado que el ciclo de vida de un hilo incluye la creación, preparación, ejecución, bloqueo y destrucción de etapas, cuando el número de tareas que pendientes es pequeña, podemos crear varios hilos para manejar las tareas correspondientes, pero cuando hay un gran número De las tareas, la creación y la destrucción de los hilos requiere muchas sobrecargas, y el uso de piscinas de hilos aliviará en gran medida estos problemas.
2 Uso de la piscina de hilos
Solo necesitamos usar el método estático proporcionado por la clase de ejecutores para crear el grupo de subprocesos correspondiente:
Public static ejecutorsevice NewsingLethreadExecutor () public static staticSeVice NewfixedThreadPool () public static static ejecutorsevice newcachedre adpool ()
NewsLethreadExecutor Devuelve un ejecutor que contiene un solo hilo.
NewFixedThreadPool devuelve un grupo de subprocesos que contiene un número especificado de hilos.
NewCachedThreadPool crea los hilos correspondientes en función del número de tareas del usuario.
Solo necesitamos poner la tarea que se ejecutará en el método Ejecutar y entregar la clase de implementación de la interfaz ejecutable al método Ejecutar del grupo de subprocesos como un parámetro, como se muestra a continuación:
Ejecutor Ejecutor = Ejecutors.NeWSingLethreadExeCutor (); Executor.ExEcute (new Runnable () {public void run () {// Tareas ejecutadas}}Si necesita pasar parámetros a la tarea, puede hacerlo creando una clase de implementación para la interfaz ejecutable.
3. Ejemplo
(1): NewsingLethreadExecutor
Mythread.java
publicClassMyThread extiende el hilo {@Override publicvoid run () {System.out.println (Thread.CurrentThread (). GetName () + "Ejecutivo ..."); {// Cree un grupo de subprocesos que puede reutilizar el número de hilos de hilos Ejecutsorservice Pool = Ejecutores. ; Pool.Execu TE (T2); Resultado de salida
Pool-1-Thread-1 se está ejecutando. . . Pool-1-Thread-1 se está ejecutando. . . Pool-1-Thread-1 se está ejecutando. . . Pool-1-Thread-1 se está ejecutando. . . Pool-1-Thread-1 se está ejecutando. . .
(2): NewFixedThreadPool
Testfixedthreadpool.java
PublicClass TestFixedThreadPool {publicStaticVoid Main (String [] args) {// Crea un grupo de subprocesos que puede reutilizar el número fijo de los hilos EjecutorService Pool = Ejecutores.NewFixedThreadpo OL (2); Runnable Interface Thread T1 = New MyThread (); La piscina ejecuta Pool.ExCute (T1); }} Resultado de salida
Pool-1-Thread-1 se está ejecutando. . . Pool-1-Thread-2 se está ejecutando. . . Pool-1-Thread-1 se está ejecutando. . . Pool-1-Thread-2 se está ejecutando. . . Pool-1-Thread-1 se está ejecutando. . .
(3): NewCachedThreadpool
TestCachedthreadpool.java
PublicClass TestCachedThreadPool {publicstaticVoid Main (String [] args) {// Crea un grupo de subprocesos que puede reutilizar el número de hilos de hilos Ejecutorservice Pool = Executors.NewCachedThread Pool (); Runnable Interface Thread T1 = New MyThread (); Ejecutar en Pool.ExCute (T1); } Resultado de salida:
Pool-1-Thread-2 se está ejecutando. . . Pool-1-Thread-4 se está ejecutando. . . Pool-1-Thread-3 se está ejecutando. . . Pool-1-Thread-1 se está ejecutando. . . Se está ejecutando Pool-1-Thread-5. . .
(4): NewscheduledThreadpool
TestScheduledThreadPoolExecutor.java
PublicClass TestScheduledThreadPoolExecutor {publicStaticVoid Main (String [] args) {ProchuledThreadPoolExecutor Exec = New ProchuledThreadPoolExecut tor (1); tirar nueva runtimeException (); ==================================================== =========== Runna ble () {// Imprima el tiempo del sistema de vez en cuando, lo que demuestra que los dos no tienen influencia entre sí @Override publicvoid run () {System.out.println (System.nanotime ()); Resultado de salida
==================================================== ==================================================== ==================================================== ==================================================== ==================================================== =====