Начиная с Java 5, Java предоставляет свой собственный бассейн. Пул потоков - это контейнер потока, который выполняет только номинальное количество потоков за раз. java.util.concurrent.threadpoolexecutor - это такой пул потоков. Он очень гибкий, но это также сложно использовать, поэтому эта статья представит ее.
Во -первых, конструктор. Возьмите простейший конструктор в качестве примера:
Public ThreadPoolexeCutor (int corepoolsize, int maximumpoolsize, Long KeepaliveTime, TimeUnit Unit, Blockingqueue <Runnable> workqueue)
Это выглядит довольно сложно. Позвольте мне представить это здесь.
CorePoolsize относится к зарезервированному размеру пула потоков.
Maximumpoolsize относится к максимальному размеру пула резьбов.
KeepAliveTime относится к времени ожидания, когда заканчивается холостое время.
Единица - это перечисление, представляющее единицу KeepaliveTime.
Workqueue представляет очередь для хранения задач.
Мы можем понять значение этих параметров из рабочего процесса пула потоков. Рабочий процесс пула потоков выглядит следующим образом:
1. Когда бассейн потоков был впервые создан, внутри не было нити. Очередь задачи передается как параметр. Однако, даже если в очереди есть задачи, пул потоков не выполнит их немедленно.
2. При вызове метода execute () для добавления задачи пул потоков вынесет следующее решение:
а.
b.
C.
D.
3. Когда поток выполняет задачу, для выполнения очереди потребуется задача.
4. Когда нить не имеет ничего общего, и это займет определенное количество времени (KeepAliveTime), пул потоков будет судить, что если количество работающих в настоящее время потока больше, чем CorePoolsize, то нить будет остановлен. Таким образом, после того, как все задачи пула потоков будут выполнены, он в конечном итоге уменьшится до размера CorePoolsize.
Этот процесс показывает, что сначала не нужно выполнять задачу, если вы сначала присоединитесь к задаче. Предполагая, что размер очереди составляет 10, corepoolsize равен 3, а Maximumpoolsize - 6, затем, когда добавляются 20 задач, порядок выполнения следующим образом: сначала задачи 1, 2, 3 выполняются, а затем задачи 4 ~ 13 разместятся в очереди. В настоящее время очередь заполнена, задачи 14, 15, 16 будут выполнены немедленно, и задачи 17 ~ 20 будут отдавать исключения. Окончательный заказ: 1, 2, 3, 14, 15, 16, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13. Вот пример использования пула потоков:
public static main (string [] args) {blockqueue <Runnable> queue = new LinkedBlockqueue <lunnable> (); 0; Out Println (String.format ("Thread %D
Объяснение этого примера заключается в следующем:
1. Blockingqueue - это всего лишь интерфейс. Преимущество использования LinkedBlockingQueue заключается в том, что нет ограничения размера. Таким образом, поскольку очередь не будет заполнена, Execute () не будет выбросить исключение, а количество потоков, работающих в пуле потоков
2. Метод выключения () не будет блокировать. После вызова метода shutdown () основной поток немедленно заканчивается, и пул потоков будет продолжать работать до тех пор, пока все задачи не будут выполнены перед остановкой. Если метод shutdown () не называется, пул потоков останется так, чтобы новые задачи могли быть добавлены в любое время.
На этом этапе я представил лишь небольшую часть этого пула потоков. ThreadPoolexeCutor очень масштабируем, но предпосылка для его расширения состоит в том, чтобы быть знакомым с тем, как он работает. В следующей статье будет объяснено, как расширить класс ThreadPoolexeCutor.
Класс ava.util.concurrent.threadpoolexecutor обеспечивает богатую расширяемость. Вы можете настроить его поведение, создав его подкласс. Например, я хочу распечатать сообщение после окончания каждой задачи, но я не могу изменить объект задачи, тогда я могу написать это:
ThreadPoolexecutor executor = new ThreadPoolexeCutor (размер, MaxSize, 1, TimeUnit.days, queue) {@Override Protected void после эксплуатации (runnable r, t hrowable t) {System.out.println ("Задача закончена.");
В дополнение к методу после эксплуатации, класс ThreadPoolexeCutor также имеет методы до выполнения () и завершенного (), которые могут быть переопределены, которые выполняются до выполнения задачи и после того, как весь пул потоков будет остановлен.
В дополнение к добавлению действий до и после выполнения задач ThreadPoolexeCutor также позволяет настроить политику выполнения после сбоя задач. Вы можете вызвать метод SetRectedExecutionHandler () пула потоков и заменить существующую политику на пользовательский объект DecuceedExecutionHandler. ThreadPoolexeCutor предоставляет 4 существующих политика, а именно:
ThreadPoolexeCutor.Abortpolicy: указывает, что задача отклоняется, и исключение брошено
Threadpoolexecutor.discardpolicy: означает отклонение задачи, но не выполнять никаких действий
ThreadPoolexeCutor.callerrunSpolicy: указывает, что задача отклоняется, и задача выполняется непосредственно в потоке вызывающего абонента.
ThreadPoolexeCutor.discardoldestpolicy: это означает, что первая задача в очереди задачи сначала отбрасывается, а затем задача добавляется в очередь.
Вот пример:
ThreadPoolexeCutor Executor = new ThreadPoolexeCutor (размер, MaxSize, 1, TimeUnit.Days, Queue);
Исполнитель.setrejectedExecutionHandler (new ThreadPoolexeCutor.discardPolicy ());
Кроме того, вы также можете написать свои собственные политики, внедрив интерфейс DrecueedExecutionHandler. Вот пример:
ThreadPoolexeCutor executor = new ThreadPoolexeCutor (3, 6, 1, TimeUnit.seconds, queue, new decuceedExecutionHandler () {public void decueedExecuti на (Runnable r, tradePoolexecutor executor) {System.out.println (String.format ("task %d -rejector) {System.out.print . ", R.hashcode ());}});