В следующих примерах в основном обсуждаются два вопроса:
Вопрос 1. Пул резьбов зафиксирован по размеру, предполагая, что он 5. Тогда как выполняется эффект работы в размере 10 потоков в пул потоков? Статус других потоков?
Вопрос 2. Так как же удалить потоку из пула потоков или, если быть точным, чтобы сделать поток холостовым потоком?
пример:
пакет com.dada.executorservice; импортировать java.util.concurrent.timeUnit; открытый класс jobThread Extends Thread {// Назовите поток public jobThread (string name, long ThinkId) {super (name); } @Override public void run () {// Если основной поток содержит этот поток, он будет работать, while (mainThread.Threadnamemap.containSkey (this.getName ()))) {try {System.out.println ("Имя потока: ----- + this.getName ()); TimeUnit.seconds.sleep (4); } catch (Exception e) {e.printstackTrace (); }} System.out.println ("****************** Концы потока, имя потока: *************" + this.getName ()); }} пакет com.dada.executorservice; импортировать java.util.hashmap; импортировать java.util.concurrent.executorservice; импортировать java.util.concurrent.executors; импортировать java.util.concurrent.timeUnit; открытый класс MainThread {public Static final int threadpool_size = 5; // Сгенерировать пул потоков с фиксированным размером общедоступный статический executorservice exec = executors.newfixedthreadpool (threadpool_size); // Карта, используемая для хранения имен потоков общедоступной статической карты <string, string> threadnamemap = new hashmap <string, string> (); public static void main (string [] args) {// вставить 10 потоков в пул потоков, но пул потоков допускает только максимум 5 потоков, поэтому остальные 5 потоков ждут (int i = 0; i <threadpool_size+5; i ++) {string threadname = getThreadName (i); threadnamemap.put (ThreadName, ThreadName); exec.execute (new JobThread (ThreadName, i)); } System.out.println ("размер хэш -таблицы:" + threadnamemap.size ()); try {System.out.println («Основная поток спит некоторое время!»); TimeUnit.seconds.sleep (3); } catch (Exception e) {e.printstackTrace (); System.out.println ("Wake Up!"); } // Следующее используется для удаления потоков в пуле потоков // elementread (0); // Удалить читайте (1); // удалить (2); } public static void RemovetHread (int i) {threadnamemap.remove (getThreadName (i)); System.out.println ("Delete Threadthread" + i + ", размер хэш -таблицы:" + threadnamemap.size ()); } public Static String getThreadName (int i) {return "threadName"+i; }} Непосредственно запустите результат кода:
ThreadName: ------ ThreadName0
Размер хэш -таблицы: 10
Спи некоторое время в главной теме!
ThreadName: ------ ThreadName2
ThreadName: ------ ThreadName4
ThreadName: ------ ThreadName1
ThreadName: ------ ThreadName3
ThreadName: ------ ThreadName4
ThreadName: ------ ThreadName2
ThreadName: ------ ThreadName3
ThreadName: ------ ThreadName1
ThreadName: ------ ThreadName0
ThreadName: ------ ThreadName1
ThreadName: ------ ThreadName3
ThreadName: ------ ThreadName0
ThreadName: ------ ThreadName4
ThreadName: ------ ThreadName2
ThreadName: ------ ThreadName1
ThreadName: ------ ThreadName3
ThreadName: ------ ThreadName4
в заключение:
Найдено напечатано: имя потока было от ThreadName0 до ThreadName4, без другого имени.
Доказано, что 10 потоков помещены в бассейн резьбов, но размер пула резьбов составляет 5, и только 5 потоков могут быть выделены процессорами. Запуск один - первый, который положил в пул потоков, а другие потоки находятся в состоянии готового состояния (состояние блокировки).
После удаления комментариев код запускается:
ThreadName: ------ ThreadName0
ThreadName: ------ ThreadName2
ThreadName: ------ ThreadName4
Размер хэш -таблицы: 10
Спи некоторое время в главной теме!
ThreadName: ------ ThreadName1
ThreadName: ------ ThreadName3
Delete Thread Thread0, размер хэш -таблицы: 9
Удалить резьбу потока 1, размер хэш -таблицы: 8
Удалить резьбу Thread2, размер хэш -таблицы: 7
*************
*************
ThreadName: ------ ThreadName5
ThreadName: ------ ThreadName6
*************
ThreadName: ------ ThreadName4
ThreadName: ------ ThreadName7
ThreadName: ------ ThreadName3
ThreadName: ------ ThreadName6
ThreadName: ------ ThreadName5
ThreadName: ------ ThreadName7
ThreadName: ------ ThreadName4
ThreadName: ------ ThreadName3
ThreadName: ------ ThreadName5
ThreadName: ------ ThreadName6
ThreadName: ------ ThreadName7
ThreadName: ------ ThreadName4
ThreadName: ------ ThreadName3
в заключение:
Из результатов мы видим это перед удалением потока, работающий поток по -прежнему находится от Thread0 до Thread4. После удаления потока потока 0 новая потока Thread3 начинается запускаться, и он переходит в ThreadName7 в порядке.
Резюме следующее:
1. Пул резьбов фиксируется по размеру, предполагая, что он 5. Тогда как работает эффект работы 10 потоков в пул резьбы? Статус других потоков?
а Концепция пула потоков заключается в том, что вы продолжаете нажимать на него запросы, но она может обрабатывать потоки только с указанными квотами, и дополнительные потоки будут ждать в нем.
беременный Когда одна из потоков завершила обработку (выполнение бизнеса завершено или while -цикл выходит из строя), пул потоков автоматически выведет задание из очереди ожидания и использует поток холостого хода для запуска задания. Какой бассейн резьбов в пуле белых потоков должен основываться на порядке, в котором он размещен.
2. Как удалить нить из бассейна резьбов или, если быть точным, чтобы сделать нить температурой холостого хода?
Пул резьбов не может получить одну из потоков и убить его, потому что основной поток с использованием пула потоков и потока, открываемые основным потоком, находятся на одном уровне, и никто не имеет права доминировать в выживании другой стороны. Но вы можете изменить метод и достичь цели тактичным образом.
а Главная нить поддерживает хэш -таблицу, которая может быть хэшматой. Ключевое значение является произвольным, но оно должно быть уникальным и может уникально указать поток.
беременный Все потоки, размещенные в пуле потоков, должны генерировать значение клавиши, а затем хранить его в этой Hashmap.
в Для потоков класса петли, таких как потоки while (true). Необходимо добавить условие, чтобы проверить, существует ли ключ этого потока в вышеуказанном хэшмапе. Выйдите из петли, если он не существует.
дюймовый Хотя основной поток не может доминировать в выживании других потоков, он может положить или удалять свой собственный HashMap. На этом этапе, пока соответствующее значение ключа потока удаляется из HashMap, поток автоматически выйдет в следующий раз, когда он зациклена.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.