Пакет Java.util.concurrent предоставляет классы о многопоточных операциях. Обычно используемыми являются классы исполнителей и ее реализации (например, ThreadPoolexeCutor и т. Д.), Исполнители, исполнители, будущее, вызов и т. Д.
1. Интерфейс ExecutorService (наследуется от исполнителя): предоставляет некоторые асинхронные многопоточные методы работы, такие как execute (), upper (), shutdown (), shutdownnow () и т. Д.
2. Интерфейс исполнителя: выполнить отправленную задачу (поток), только один метод выполнен (запустить A)
2. Класс исполнителей: предоставляет некоторые заводские методы и некоторые публичные методы для использования подклассов исполнителя и Treadfactory и т. Д., Такие, как newxxx (), xxxthreadfactory () и т. Д.
3. Futrue Interface: представляет результат выполнения потока, предоставляет методы для получения результата выполнения потока и отмены потоков, таких как get (), cancle () и т. Д.
4. Callable Interface: поток с возвращаемым значением предоставляется JDK1.5 для выполнения нового интерфейса
Сделайте простые записи о понимании исполнителей и будущего
Код:
открытый класс main {private static int count = 0; public static void main (string [] args) {list <Future> resultList = new LinkedList <> (); /*** executors.newcachedthreadpool () Создать пул кэша потоков. Если поток не используется в 60 -х годах, поток будет остановлен и удален из пула пула кэша* executors.newschedudThreadpool () Создать пул потоков с фиксированной емкостью, а потоки внутри выполняются в соответствии с установленным временем планирования* expertors.newfixedThreadpool () имеют пул с фиксированной емкостью. поток*/ executorservice executorservice = executors.newcachedthreadpool (); для (int i = 0; i <10; i ++) {future future = executorservice.submit (new Callable <string> () {@Override public String call () {try {System.out.println (Thread.currentThread (). getName ()); Threat.Sleep (5000);} catchedException e) {E.print stack stackcept {e.print stack extack e) Main.count; ResultList.Add (будущее); } executorservice.shutdown (); для (будущее будущее: resultlist) {try {System.out.println (future.get () + ".. IS Over ..."); } catch (прерванное искусство e) {e.printstacktrace (); } catch (executionException e) {e.printstackTrace (); }} System.out.println ("end ind stude ..."); }}Выход:
Pool-1-Thread-1POOL-1-THREAD-2POOL-1-THREAD-3POOL-1-THREAD-4POOL-1-THRED-5POOL-1-TTHREAD-6POOL-1-THRED-7POOL-1-THREAD-8POOL-1-THREAD-9POOL-1-THREAL-1POOL-1-START MAIN COUNT: ... 0POOL-1-TTHRED-1. Основной счет: ... 1POOL-1-THREAD-2..END Основной счет: ... 1POOL-1-THREAD-1..END Главный счет: ... 1POOL-1-THREAD-3..ND Основной счет: ... 1POOL-1-THREAD-2..END MANE: ... 1POOL-1-THREAD-1..END MANE: ... 1POOL-1-TTHREAD-3 .. Over ... Pool-1-Thread-4.. Начальный основной счет: ... 2POOL-1-TTHREAD-3..IS OUR ... POOL-1-THREAD-4..IND ОСНОВНЫ count: ... 4pool-1-thread-6..н. count: ... 6pool-1-thread-7..Is over ... pool-1-thread-8 .. Начиная с основного количества: ... 6POOL-1-THREAD-8..NED ОСНОВНЫ Считайте: ... 7POOL-1-THREAD-9..NEND MANE COUNT: ... 8POOL-1-THREAD-9..IS OUR ... POOL-1-THREAD-10..STARD Основной счет: ... 8POOL-1-THREAD-9..IS Over ... Pool-1-THREAD-10 .. Начал основной счет: ... 8POOL-1-THREAD-1
Консоль печатает результат вывода выше после ожидания 5 секунд. Причина в том, что когда все потоки начнутся, это одновременная операция и будет ждать 5 секунд. Так что в целом кажется, что он ждал всего 5 секунд. Это одновременная операция.
Суммировать:
1. Разница между методом execute () и методом отправки (), предоставленным executorservice:
а Метод execute () принимает только экземпляры запускаемого типа, поэтому он не может получить возвращаемое значение, и он не может динамически получить ситуацию выполнения потока.
беременный Метод отправки () принимает выполняемые и выигрываемые экземпляры и вернет будущий экземпляр. Метод get () будущего экземпляра может получить возвратное значение выполнения потока и исключить исключения из выполнения потока. Поэтому, если вы хотите получить результат, возвращенный в результате выполнения потока, и иметь возможность обрабатывать возможные исключения во время выполнения потока, или если вы хотите отменить выполнение потока в середине, вы можете использовать метод отправки ()
2. Через вывод можно увидеть, что основной метод (основной поток) заканчивается после того, как все потоки завершили выполнение. Причина:
а Получите будущий экземпляр через метод отправки () и получите результат возврата потока через метод get () будущего экземпляра. Метод get () будущего экземпляра будет ждать, пока поток выполнится перед возвращением, поэтому основной метод будет ждать, пока все речь
беременный Если петля для снята красного цвета удаляется, основной метод (основной поток) закончится рано, не ожидая, пока все речь
Пополнить:
1. Когда несколько потоков выполняются одновременно, если исключение происходит в одном из потоков и не обрабатывается, поток автоматически остановит выполнение, но другие потоки все равно будут нормально выполняться. Вот почему Tomcat может продолжать предоставлять услуги, когда в запросе Tomcat возникает исключение.
2. Tomcat предоставляет бассейн и бассейн ожидания. Каждый запрос перезагрузит новый поток для обработки запроса. Если потоки в бассейне резьбы будут изготовлены, они будут помещены в бассейн ожидания и подождите. Когда поток будет выпущен обратно в пул потоков, поток будет назначен для обработки запросов в пуле ожидания.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.