Введение в несколько методов реализации и различий пула потоков Java
import java.text.dateformat; import java.text.simpledateformat; import java.util.arraylist; import java.util.date; import java.util.list; import java.util.list; import java.util.concurrent.callable; import java.utl.concurrent.exervice. java.util.concurrent.executors; import java.util.concurrent.future; открытый класс TestThreadpool {// -newfixedThreadpool похож на Cachethreadpool и также может использоваться, если он повторно используется, но он не может создавать новые потоки в любое время // - его уникальность: в любой момент, в наибольшее время, в наибольшей степени. В настоящее время, если необходимо установить новую поток, его можно помещать только в другую очередь и подождать, пока нить в текущей потоке не завершится и не будет выведена из бассейна напрямую // - в отличие от Cachethreadpool, Fixedthreadpool не имеет механизма простоя (он также может быть, но в документе он не должен быть очень длинным, что не так, как и вверху, так же, что он не так длится, что не так долго, что не так долго, что не так долго, что не так, как и вверху. FixedThreadpool в основном предназначен для некоторых очень стабильных и фиксированных регулярных одновременных потоков, в основном используемых на серверах // - из исходного кода метода, пула кэша и исправленных вызовов пула одинакового базового пула, но параметры разные: // Сеспочт фиксированной резьбы пула, и это 0 -й второй пост (нет идентификатора) // Сеспот. вообще не учитывается), 60 второго непрерывного статического статического исполнителя FixedService = executors.newfixedThreadpool (6); // -Cache Pool, сначала проверьте, есть ли ранее установленные потоки в бассейне, если есть, повторно использовать. Если нет, создайте новый поток и добавьте его в пул // -Кэш, как правило, используется для выполнения некоторых асинхронных задач с очень коротким сроком службы // Следовательно, он не используется на некоторых серверах типа, ориентированных на соединение. // - Поток, который может повторно использовать, должен быть потоком в бассейне в рамках тайм -аута. Тайм -аут по умолчанию - 60 -е годы. Если время холостого хода превышает продолжительность, экземпляр потока будет прекращен и перенесен из бассейна. // Обратите внимание, что поток вмещает CachedThreadpool, не нужно беспокоиться о его конце. Если он неактивен после тайм -аута, он будет автоматически прекращен. Частный статический исполнитель CashService = executors.newcachedThreadpool (); // -Singleton Thread, в пуле в любое время может быть только в одном пуле времени // -/ -базовый пул, такой же, как в пуле кеша и фиксированного пула, но количество потоков составляет 1-1,0 секунды. // -scheduled Thread Pool // -В этом пуле можно отложить последовательно в соответствии с графиком или частной статической executorservice preduledservice = experators.newschedledThreadpool (10); public static void main (string [] args) {dateformat format = new SimpleDateFormat ("yyyy-mm-dd HH: MM: SS"); Список <Integer> customerlist = new ArrayList <Integer> (); System.out.println (format.format (new Date ())); testfixedthreadpool (FixedService, CustomerList); System.out.println ("--------------------------"); testfixedthreadpool (FixedService, CustomerList); fixedservice.shutdown (); System.out.println (fixedservice.isshutdown ()); System.out.println ("----------------------------------------------------"); testcachethreadpool (CachService, CustomerList); System.out.println ("----------------------------------------------------"); testcachethreadpool (CachService, CustomerList); cacheservice.shutdownnow (); System.out.println ("----------------------------------------------------"); testsingleservicethreadpool (SingleService, CustomerList); testsingleservicethreadpool (SingleService, CustomerList); SingleService.shutdown (); System.out.println ("----------------------------------------------------"); testscheduledservicethreadpool (PraduledService, CustomerList); testscheduledservicethreadpool (PraduledService, CustomerList); raduledservice.shutdown (); } public static void testscheduledServicethretReadPool (служба receportorservice, list <Integer> customerlist) {list <callable <Integer >> listcallable = new Arraylist <callable <Integer >> (); for (int i = 0; i <10; i ++) {callable <Integer> callable = new Callable <Integer> () {@override public integer call () Throws exection {return new random (). nextint (10); }}; listCallable.add (Callible); } try {list <future <Integer >> listfuture = service.invokeall (listcallable); для (будущее <Integer> будущее: listfuture) {integer id = future.get (); customerlist.add (id); }} catch (Exception e) {e.printstackTrace (); } System.out.println (customerlist.tostring ()); } public static void testsingLeservicetReadPool (Seperformervice Service, List <Integer> customerlist) {list <callable <list <Integer >>> listcallable = new ArrayList <callable <list <Integer >>> (); для (int i = 0; i <10; i ++) {callable <list <Integer >>> callable = new Callable <list <Integer >> () {@override public list <Integer> call () Throws Exception {list <Integer> list = getList (new Random (). NextInt (10)); логический isstop = false; while (list.size ()> 0 &&! isstop) {System.out.println (Thread.currentThread (). getId () + " - Sleep: 1000"); isstop = true; } return List; }}; listCallable.add (Callible); } try {list <future <list <Integer >>> listfuture = service.invokeall (listcallable); Для (будущий <list <Integer >> Future: ListFuture) {List <Integer> list = future.get (); customerlist.addall (список); }} catch (Exception e) {e.printstackTrace (); } System.out.println (customerlist.tostring ()); } public static void testCachetHreadpool (Seperformervice Service, List <Integer> customerlist) {list <callable <list <Integer >>> listcallable = new ArrayList <callable <list <Integer >> (); для (int i = 0; i <10; i ++) {callable <list <integer >> callable = new Callable <list <Integer >> () {@override public list <Integer> call () Throws Exception {list <Integer> list = getList (new random (). nextint (10)); логический isstop = false; while (list.size ()> 0 &&! isstop) {System.out.println (Thread.currentThread (). getId () + " - Sleep: 1000"); isstop = true; } return List; }}; listCallable.add (Callible); } try {list <future <list <Integer >>> listfuture = service.invokeall (listcallable); Для (будущий <list <Integer >> Future: ListFuture) {List <Integer> list = future.get (); customerlist.addall (список); }} catch (Exception e) {e.printstackTrace (); } System.out.println (customerlist.tostring ()); } public static void testfixedThreadpool (Seperformervice Service, List <Integer> customerlist) {list <callable <list <Integer >>> listcallable = new ArrayList <callable <list <Integer >>> (); для (int i = 0; i <10; i ++) {callable <list <integer >> callable = new Callable <list <Integer >> () {@override public list <Integer> call () Throws Exception {list <Integer> list = getList (new random (). nextint (10)); логический isstop = false; while (list.size ()> 0 &&! isstop) {System.out.println (Thread.currentThread (). getId () + " - Sleep: 1000"); isstop = true; } return List; }}; listCallable.add (Callible); } try {list <future <list <Integer >>> listfuture = service.invokeall (listcallable); Для (будущий <list <Integer >> Future: ListFuture) {List <Integer> list = future.get (); customerlist.addall (список); }} catch (Exception e) {e.printstackTrace (); } System.out.println (customerlist.tostring ()); } public Static List <Integer> getList (int x) {list <Integer> list = new ArrayList <Integer> (); list.add (x); list.add (x * x); вернуть список; }}Использование: LinkedBlockingQueue для реализации объяснения пула потоков
// Например: CorePoolSize = 3, MaximumUplSize = 6, LinkedBlockqueue (10) // DEFUCEEDExeCutionHandler по умолчанию метод обработки по умолчанию: ThreadPoolexeCutor.Abortpolicy // ThreadPoolexeCutor executorerservice = new ThreadPoolexeCutor (corepoolsize, maximumpize, 1l, TimeOnit, SemOnit, SemOnit. LinkedBlockingqueue <Runnable> (10)); // 1. Если поток, работающий в пуле потоков (то есть, вызов expertorservice.execute) не достигает LinkedBlockingQueue.init (10), количество выполненных в настоящее время потоков: corepoolsize (3) // 2. Если количество потоков превысило LinkedBlockQueue.init (10) и превысило> = init (10)+corepoolsize (3) и меньше, чем init (10)+maximumpoolsize. Количество запущенных в настоящее время потоков: (текущие потоки-init (10)) // 3. Если количество вызванных потоков превышает init (10)+Maximumpoolsize, это обрабатывается в соответствии с правилами DecuceedExecutionHandler.
О: Объяснение нескольких реализаций по умолчанию DecueedExecutionHandler
// используется по умолчанию: ThreadPoolexeCutor.Abortpolicy. Обработчик отклоняется и бросит время выполнения DuceededExecutionException. DecuceedExecutionhandler police = new ThreadPoolexeCutor.AbortPolicy (); //// в threadpoolexecutor.callerrunspolicy, поток вызывает саму выполнение, которое выполняет задачу. Эта стратегия обеспечивает простой механизм управления обратной связью, который может замедлить представление новых задач. // police = new ThreadPoolexeCutor.callerrunSpolicy (); //// в threadpoolexecutor.discardpolicy, задачи, которые не могут быть выполнены, будут удалены. // police = new ThreadPoolexeCutor.discardPolicy (); //// в threadpoolexecutor.discardoldestpolicy, если исполнитель не был закрыт, задача во главе работы в работе будет удалена, и выполнение программы будет повторно (повторите этот процесс, если он снова потерпит неудачу). // policy = new ThreadPoolexeCutor.discardEldestPolicy ();
Вышеуказанное введение в методы реализации и различия пула потоков Java - это весь контент, которым я поделился с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.