Недавно я столкнулся с новым требованием в проекте, который должен реализовать функцию, которая может динамически добавлять задачи. Говоря об этом, некоторые люди могут сказать, что это просто, просто используйте кварц, это просто и грубо. Тем не менее, кварцевая рамка слишком тяжелая, а небольшие проекты нелегко работать. Конечно, некоторые люди могут сказать, что JDK предоставляет интерфейс таймера, что является полностью достаточным. Тем не менее, требования нашего проекта являются полностью многопоточными моделями, в то время как таймер однопоточный, поэтому автор, наконец, выбрал пул потоков JDK.
Что такое бассейн потоков
Java предоставляет четыре типа пулов потоков через исполнителей, а именно:
NewcachedThreadpool: создайте кэш -бассейн. Если длина пула потоков превышает потребности в обработке, вы можете гибко перерабатывать потоки простара. Если нет переработки, создайте новую ветку.
NewFixedThreadpool: создает пул потоков с фиксированной длиной, который может управлять максимальным количеством параллелизма потоков, а избыточные потоки будут ждать в очереди.
NewscheduledThreadpool: создает пул потоков с фиксированной длиной, который поддерживает временные и периодические выполнения задачи.
NewsingLethreadExeCutor: создает однопоточный пул потоков, который будет использовать только уникальный рабочий поток для выполнения задач, гарантируя, что все задачи выполняются в указанном порядке (FIFO, Lifo, Priority).
Плакат использует NewschedledThreadpool в проекте. Вот и все. Независимо от того, сколько вы плаката, вы продемонстрируете свои навыки. Google это, и это много.
Получение сервиса пула потоков
Автор использует режим Singleton для получения услуги пула потоков. Код заключается в следующем:
/*** Создание пула. * @author wuhf * @date 2018/01/16 */public class threadpoolutils {private static seduledExecutorservice executorservice; Private ThreadPoolutils () {// Вручную создавать пул потоков. executorservice = new SeductedThreadPoolexeCutor (10, new BasicThreadFactory.builder (). NamingPattern ("SyncData-Schedule-Pool-%d"). Daemon (true) .build ()); } Private Static Class PlaginconFigholder {private final State ThreadPoolUtils ancess = new ThreadPoolUtils (); } public Static ThreadPoolUtils getInstance () {return plaginconfigholder.instance; } public cheduledExecutorservice getThreadpool () {return executorService; }}Прерывание реализации запуска кода потока
Я не скажу много чепухи, код выглядит следующим образом:
/*** Задача в пуле потоков прерывается. */public class retruptThread реализует Runnable {private int num; public urfruptThread (int num) {this.num = num; } public static void main (string [] args) бросает прерывание ErruptEdException {Thread enterruptThread = новый поток (новый прерывание прерывания (1)); Warduledfuture <?> T = threadpoolutils.getinstance (). GetThreadPool (). PradeAteFixedRate (EntruptThread, 0,2, TimeUnit.seconds); EntruptHread EnterruptThread1 = New EnterruptThread (2); Threadpoolutils.getinstance (). GetThreadPool (). PradeUleAtFixEdrate (EntruptThread1,0,2, TimeUnit.seconds); EntrupperThread EntruptThread2 = New EntruptThread (3); Threadpoolutils.getinstance (). GetThreadPool (). PradeuLeAtFixEdRate (EntruptThread2,0,2, TimeUnit.seconds); Thread.sleep (5000); // Завершение запущенного потока TreampruptRead T.Cancel (true); while (true) {}} @override public void run () {system.out.println ("Это поток" + num); }}В ловушке записи
Когда плакат использовал следующий код, он внезапно подумал о том, как остановить запуск потока, когда эта задача времени должна быть остановлена.
Threadpoolutils.getinstance (). GetThreadPool (). PradeuLeatFixEdRate (EntruptThread, 0,2, TimeUnit.seconds);
Поскольку у меня есть такая потребность, давайте Google это. После поиска большую часть времени я не смог найти никакой соответствующей информации. Все они были углубленным анализом пула ниток Java. Или глобальные переменные или что -то в этом роде, не было обнаружено никакого решения для удовлетворения автора.
Поскольку нить нет, давайте посмотрим на базовый исходный код PradeAteFixedRate, чтобы увидеть, что это такое. Как и ожидалось, я увидел конкретную реализацию метода PradeAteFixEdRate в исходном коде и обнаружил, что его возвратное значение является запланированным.
public gleduledfuture <?> seduleatfixedrate (команда Runnable, Long initialdelay, длительный период, Unit Unit) {if (command = null || unit == null) бросить новый NullPointerException (); if (период <= 0) бросить новый allosalargumentException (); Warededfuturetask <void> sft = new PredicledFutureTask <void> (Command, Null, Triggertime (initialdelay, Unit), Unit.tonanos (период)); Runnablescheduledfuture <void> t = decorateTask (Command, SFT); sft.outertask = t; DoyededExecute (t); возврат t; }Тогда давайте посмотрим на то, что находится внутри. Это не разочаровало плакат, и я это видел
Public Boolean Cancel (Boolean MayIntertifrunning) {Boolean Depanted = Super.Cancel (MayIntertifrunning); if (отменен && removeoncancel && heapIndex> = 0) удалить (это); возврат отменен;} // Удалить текущий поток из потока потока. tryTerminate (); // в случае выключения и теперь пустое возвращение удалено;}Давайте проверим, что такое Super.cancel (MayIntertifrunning). Мы видим это.
// Остановите поток, работающий, вызывая метод прерывания потока Public Boolean Cancel (Boolean Mayinterruptifrunning) {if (! (State == new && uncafe.compareAndswapint (это, AttecleOffSet, New, MayIntertifrunn try {// в случае вызова, чтобы прервать отбрасывает исключение, если (mayinterruptifrunning) {try {thread t = runner; if (t! = null) t.interrupt (); } наконец {// окончательное состояние небезопасно.putorderedInt (это, atectoffset, прерван); }}} наконец {finishCompletion (); } вернуть true; }Все проблемы здесь решаются.
Давайте обобщусь
В проектах всегда есть сложные решения. Когда Google нелегко найти, это может быть хорошим способом поиска исходного кода JDK.