Этот пример разделяет код реализации пула рукописных потоков Java для вашей ссылки. Конкретный контент заключается в следующем
1. БИБЛЕТ ТЕРПУ-это форма мультиподбота. Во время обработки задачи добавляются в очередь, а затем эти задачи автоматически запускаются после создания потока. Потоки пула потоков - все фоновые потоки.
2. Простая архитектура пула потоков
3. Простой код пула потоков (самооптимизация)
Импорт java.util.list;/** * Интерфейс потока * * @author yjian * @date 14:49 2017/10/14 **/public interface ithreadpool {// Добавить задачу void execute (выполнение задания); // Добавить задачу void execute (runnable [] tasks); // Добавить задачу void execute (list <lunnable> задачи); // уничтожить нить void destress ();} Импорт java.util.linkedlist; import java.util.list; import java.util.concurrent.atomic.atomiclong;/** * Класс реализации потока (простая реализация, самооптимизация. Предоставьте идеи) * * @author yjian * @date 14:49 2017/10/14 **/ @Suppresswarning Ithreadpool {// Количество потоков включено по умолчанию static int worker_number = 5; // количество заполненных потоков является статическим летучим int sumcount = 0; // Список очередей задач не безопасен для потока и может быть оптимизирован для статического списка Blockqueue // потока рабочей группы Workerthread [] Workthreads; // атомный статический атомный атомновый нитнум = новый Atomiclong (); Статическая Threadpoolimpl Threadpool; // метод строительства publicpoolimpl () {this (corker_number); } public ThreadPoolImpl (int porpernum) {this.worker_number = kayernum; // Разработка рабочих потоков Пространственная лента = новый работник [corker_number]; // Начать создание потока работника для (int i = 0; i <corker_number; i ++) {workthreads [i] = new corkerthread (); Thread Think = New Thread (Workthreads [i], "Threadpool-Worker" + Threadnum.incrementAndget ()); System.out.println («Инициализация количества потоков» + (i + 1) + »----------- Имя текущего потока:« + think.getName ()); Thread.Start (); }} @Override public String toString () {return "Количество рабочих потоков -" + abray_number + "Количество выполненных задач" + sumcount + "Количество задач ожидания" + taskqueue.size (); } // Получить пул потоков публичный статический ithreadpool getThreadpool () {return getThreadpool (korive_number); } public static ithreadpool getThreadpool (int rabronum) {// Допустимость ошибки, если меньше или равна 0, количество потоков по умолчанию составляет if (kayernum <= 0) {kayermum = corker_number; } if (threadpool == null) {threadpool = new ThreadPoolImpl (orabrernum); } return ThreadPool; } @Override public void execute (выполнение задания) {synchronized (taskQueue) {taskQueue.add (task); taskqueue.notifyall (); }} @Override public void execute (runnable [] tasks) {synchronized (taskqueue) {for (runnable task: tasks) {taskqueue.add (task); } taskQueue.notifyall (); }} @Override public void execute (list <Nrunnable> tasks) {synchronized (taskQueue) {for (runnable task: tasks) {taskqueue.add (task); } taskQueue.notifyall (); }} @Override public void destress () {// Где задача, все еще присутствующая в цикле, если есть ожидание 20 миллисекунд времени обработки, пока (! TaskQueue.isempty ()) {try {thread.sleep (20); } catch (прерванное искусство e) {e.printstacktrace (); }} // Если очередь задач была обработана, уничтожьте поток и очистите задачу для (int i = 0; i <abrear_number; i ++) {hablyrads [i] .setworkerflag (); рабочая щипа [i] = null; } threadpool = null; taskqueue.clear (); } // Создание рабочих потоков пула класса рабочие рабочие extends {// Использование для идентификации текущего потока принадлежит активному доступному государству частное логическое логирование isrunning = true; @Override public void run () {runnable runnable = null; // никогда не зацикливаться на (isrunning) {// non-thread-safe, так что синхронизированный (taskQueue) {while (isrunning && taskQueue.isempty ()) {try {// Если очередь задачи пуста, подождите, пока задание прослушивания на 20 миллисекундеров на goubequeue.wait (20); } catch (Exception e) {e.printstackTrace (); }} // очередь задачи не является пустой if (! TaskQueue.isempty ()) {Runnable = taskQueue.remove (0); // Получить первую задачу}} if (runnable! = Null) {runnable.run (); } sumcount ++; runnable = null; }} // Уничтожение потока public void setWorkerFlag () {iSrunning = false; }}} Импорт java.util.arraylist; import java.util.list;/** * Тестовый класс * * @author yjian * @date 15:37 2017/10/14 **/public class threatpooltest {public static void main (string [] args) {// get thread pool ithreadpool t = Threadpoolmpl.igleThreadpool (20); List <lunnable> taskList = new ArrayList <Runnable> (); for (int i = 0; i <100; i ++) {tasklist.add (new task ()); } // Выполнить задачу t.execute (tasklist); System.out.println (t); // уничтожить нить t.destroy (); System.out.println (t); } статический класс задача реализует runnable {private static letatile int i = 1; @Override public void run () {System.out.println («В настоящее время обработанный поток:« + thread.currentThread (). GetName () + «выполнение задания» + (i ++) + «полное»); }}}После изучения исходного кода Spring тщательно проверьте, какую пружину обычно используются шаблоны, используются кодом. Спецификации для написания программ должны быть такими же, как весна.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.