Este exemplo compartilha o código de implementação do pool de threads manuscritos Java para sua referência. O conteúdo específico é o seguinte
1. O pool de threads é uma forma de multi-threading. Durante o processamento, as tarefas são adicionadas à fila e, em seguida, essas tarefas são iniciadas automaticamente após a criação do thread. Os threads do pool de threads são todos os threads de fundo.
2. Arquitetura de pool de threads simples
3. Código simples do pool de threads (auto-otimização)
importar java.util.list;/** * interface do thread * * @author yjian * @date 14:49 2017/10/14 **/interface pública ITHREADPOOL {// Adicione a tarefa void Execute (tarefa executável); // Adicione a tarefa void Execute (Runnable [] tarefas); // Adicione a tarefa void Execute (list <urnnable> tarefas); // Destrua Thread void Destroy ();} importar java.util.LinkedList; importar java.util.list; importar java.util.concurrent.atomic.atomiclong;/** * THREEN DE IMPLEMENTAÇÃO (IMPLEMPENCIMENTAÇÃO AUTOMENTS, PULLIMENTS. SPLASTIMENTS. Ithreadpool {// O número de threads é ativado por padrão static int worker_number = 5; // O número de threads concluídos é estático volátil int sumCount = 0; // A lista de filas de tarefas não é segura para threads e pode ser otimizada para bloquear a lista estática <corrernable> taskQueue = new LinkedList <crunnable> (); // Thread WorkGroup WorkerThread [] WorkThreads; // atômico atômico atômico threadnum = new atomiclong (); estático threadpoolimpl threadpool; // Método de construção public ThreadPoolImpl () {this (trabalhador_number); } public threadpoolImpl (int workernum) {this.worker_number = workernum; // Desenvolva o WorkThreads Space Threads Work Threads = new WorkerThread [trabalhador_number]; // Inicie o thread Create Worker para (int i = 0; i <trabalhador_number; i ++) {workthreads [i] = new WorkerThread (); Thread Thread = novo Thread (WorkThreads [i], "Threadpool-Worker" + Threadnum.incremendget ()); System.out.println ("Inicialize o número de threads" + (i + 1) + "----------- Nome do thread atual:" + Thread.getName ()); thread.start (); }} @Override public string tostring () {return "número de threads trabalhadores é" + trabalhador_number + "número de tarefas concluídas" + sumCount + "número de tarefas de espera" + taskQueue.size (); } // obtenha thread pool public static ithreadpool getThreadpool () {return getThreadpool (trabalhador_number); } public static iThreadpool getThreadpool (int workernum) {// tolerância a falhas, se menor ou igual a 0, o número padrão de threads é se (workernum <= 0) {workernum = trabalhador_number; } if (threadpool == null) {threadpool = new ThreadPoolImpl (workernum); } retornar threadpool; } @Override public void Execute (Runnable Task) {Synchronized (TaskQueue) {TaskQueue.add (Task); TaskQueue.NotifyAll (); }} @Override public void Execute (runnable [] tarefas) {Synchronized (TaskQueue) {for (Runnable Task: Tasks) {TaskQueue.add (Task); } tarefa.NotifyAll (); }} @Override public void Execute (list <crunnable> tarefas) {synchronized (TaskQueue) {for (Runnable Task: Tasks) {TaskQueue.add (Task); } tarefa.NotifyAll (); }} @Override public void Destroy () {// Onde está uma tarefa ainda presente no loop, se houver 20 milissegundos de processamento de tempo enquanto (! TaskQueue.isEmpty ()) {tente {thread.sleep (20); } catch (interruptedException e) {e.printStackTrace (); }} // Se a fila de tarefas tiver sido processada, destrua o tópico e limpe a tarefa para (int i = 0; i <trabalhador_number; i ++) {workthreads [i] .setworkerflag (); WorkThreads [i] = null; } threadpool = null; TaskQueue.clear (); } // Crie o thread de thread do trabalhador WorkerThread estende o thread {// Use para identificar o encadeamento atual pertence ao estado ativo disponível Private Boolean Isrunning = true; @Override public void run () {runnable runnable = null; // Nunca se vira durante (isrunning) {// não-thread-sabe, tão sincronizado (TaskQueue) {while (isrunning && taskQueue.isEmpty ()) {tente {// se a fila de tarefas estiver vazia, aguarde a tarefa de audição de 20 milissegundos para alcançar a tarefa de tarefas (20); } catch (Exceção e) {e.printStackTrace (); }} // A fila de tarefas não está vazia se (! TaskQueue.isEmpty ()) {runnable = taskQueue.remove (0); // obtenha a primeira tarefa}} if (runnable! = Null) {runnable.run (); } SumCount ++; runnable = null; }} // Destrua Thread public void setWorkerFlag () {isrunning = false; }}} importar java.util.ArrayList; importar java.util.list;/** * Classe de teste * * @author yjian * @date 15:37 2017/10/14 **/public class ThreadPoolTest {public static void main (string [] args) {// get threadpool); List <crunnable> taskList = new ArrayList <drunnable> (); for (int i = 0; i <100; i ++) {taskList.add (new Task ()); } // Execute a tarefa t.execute (lista de tarefas); System.out.println (t); // Destroe o thread t.Destroy (); System.out.println (t); } classe estática Tarefa implementa runnable {private estático volátil int i = 1; @Override public void run () {System.out.println ("Atualmente processado Thread:" + thread.currentThread (). GetName () + "Execute tarefa" + (i ++) + "complete"); }}}Depois de estudar o código -fonte da primavera, verifique cuidadosamente quais padrões de mola comumente usados são usados pelo código. As especificações para a redação de programas devem ser as mesmas da primavera.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.