Este ejemplo comparte el código de implementación del grupo de subprocesos escritos a mano de Java para su referencia. El contenido específico es el siguiente
1. El grupo de subprocesos es una forma de múltiples subprocesos. Durante el procesamiento, las tareas se agregan a la cola, y luego estas tareas se inician automáticamente después de que se crea el hilo. Los hilos de la piscina de hilos son todos los hilos de fondo.
2. Arquitectura simple de piscina de hilos
3. Código simple de grupo de hilos (autooptimización)
import java.util.list;/** * interfaz de hilo * * @author yjian * @date 14:49 2017/10/14 **/interfaz pública iThreadpool {// Agregar tarea void ejecute (tarea runnable); // Agregar tareas de ejecución void (runnable []); // Agregar tareas void ejecute (list <nunnable> tareas); // destruir hilo void destruir ();} import java.util.linkedList; import java.util.list; import java.util.concurrent.atomic.atomiclong;/** * Clase de implementación de hilos (implementación simple, autooptimización. Proporcionar ideas) * * @author yjian * @Date 14:49 2017/10/14 **/ @supresswarnings ("" ")") IThReadPool {// El número de subprocesos está habilitado de forma predeterminada static int worker_number = 5; // El número de subprocesos completados es estático volátil int sumcount = 0; // La lista de colas de tareas no es segura de hilo, y puede optimizarse para bloquear la lista estática <nunnable> taskqueue = new LinkedList <Runnable> (); // hilo de trabajo de trabajo WorkSthread [] Workthreads; // Atomic static atomiclong threadnum = new AtomicLong (); shreadpoolImpl staticPool; // Método de construcción Public ThreadPoolImpl () {this (Worker_Number); } public ThreadPoolImpl (int Workernum) {this.worker_number = workernum; // Desarrollar trabajador de hilo de trabajo WorkThreads = New WorkerThread [Worker_Number]; // Comience a crear un hilo de trabajo para (int i = 0; i <trabajador_number; i ++) {WorkThreads [i] = new WorkerThread (); Thread Thread = New Thread (WorkThreads [i], "Threadpool-Worker" + Threadnum.Incrementandget ()); System.out.println ("Inicializar el número de subprocesos" + (i + 1) + "----------- Nombre actual del hilo:" + thread.getName ()); Thread.Start (); }} @Override public String toString () {return "El número de subprocesos de trabajadores es" + trabajador_number + "Número de tareas completadas" + SumCount + "Número de tareas de espera" + taskqueue.size (); } // Get Thread Pool public static ithreadpool getThreadPool () {return getThreadPool (trabajador_number); } public static Ithreadpool getThreadPool (int workernum) {// tolerancia de fallas, si es menor o igual a 0, el número predeterminado de subprocesos es if (workernum <= 0) {workernum = trabajador_number; } if (threadpool == null) {threadpool = new ThreadPoolImpl (Workernum); } return Threadpool; } @Override public void ejecute (tarea runnable) {sincronizado (taskqueue) {taskqueue.add (tarea); taskQueue.notifyall (); }} @Override public void ejecute (runnable [] tareas) {sincronizado (taskQueue) {for (runnable tareas: tareas) {tareasqueue.add (tarea); } taskqueue.notifyall (); }} @Override public void ejecute (list <nunnable> tareas) {sincronizado (tareasqueue) {for (runnable tareas: tareas) {taskqueue.add (tarea); } taskqueue.notifyall (); }} @Override public void destruye () {// ¿Dónde está una tarea presente en el bucle, si hay un tiempo de procesamiento de 20 milisegundos que esperan mientras (! TaskQueue.isEmpty ()) {try {horthing.sleep (20); } catch (InterruptedException e) {E.PrintStackTrace (); }} // Si la cola de tareas ha sido procesada, destruye el hilo y borre la tarea para (int i = 0; i <worker_number; i ++) {workthreads [i] .setworkerflag (); Workthreads [i] = null; } threadpool = null; taskqueue.clear (); } // Crea Worker Hifre Pool Clase WorkerThread extiende el hilo {// Uso para identificar el hilo actual pertenece al estado disponible activo booleano privado isrunning = true; @Override public void run () {runnable runnable = null; // nunca bucle while (isRunning) {// No segra-safe, así que sincronizado (tareaQueue) {while (isRunning && taskqueue.isEmpty ()) {try {// si la cola de tareas está vacía, espere la tarea de escucha de 20 milisegundos para llegar a tarea.wait (20); } catch (Exception e) {E.PrintStackTrace (); }} // La cola de tareas no está vacía si (! Taskqueue.isEmpty ()) {runnable = taskqueue.remove (0); // Obtenga la primera tarea}} if (runnable! = Null) {runnable.run (); } SumCount ++; runnable = null; }} // destruir hilo public void setWorkerFlag () {isRunning = false; }}} import java.util.arrayList; import java.util.list;/** * Test Class * * @author yjian * @date 15:37 2017/10/14 **/public class ThreadPoolTest {public static void main (string [] args) {// Obtener el grupo de hilo t = ThreadpoolImpl.getThreadPool (20); List <Runnable> TaskList = New ArrayList <Runnable> (); for (int i = 0; i <100; i ++) {tareas list.add (new Task ()); } // ejecutar tarea t.Execute (tareas list); System.out.println (t); // destruir hilo t.destroy (); System.out.println (t); } Tarea de clase estática implementos runnables {private static volátil int i = 1; @Override public void run () {system.out.println ("hilo procesado actualmente:" + thread.currentThread (). GetName () + "Ejecutar tarea" + (i ++) + "Complete"); }}}Después de estudiar el código fuente de primavera, verifique cuidadosamente qué primavera utilizan los patrones de uso comúnmente utilizados por el código. Las especificaciones para los programas de escritura deben ser las mismas que la primavera.
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.