Класс ThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor - это ExecutorService для выполнения каждой отправленной задачи с использованием одного из, возможно, нескольких объединенных потоков, обычно настраиваемых с использованием заводских методов Executors. Он также предоставляет различные служебные методы для проверки статистики текущих потоков и управления ими.
Методы ThreadPoolExecutor
Sr. No. | Метод и описание |
---|---|
1 | protected void afterExecute(Runnable r, Throwable t) Метод, вызываемый после завершения выполнения данного Runnable. |
2 | void allowCoreThreadTimeOut(boolean value) Устанавливает политику, определяющую, могут ли основные потоки истекать по тайм-ауту и завершаться, если в течение времени поддержки активности не поступают никакие задачи, и заменяются при необходимости при поступлении новых задач. |
3 | boolean allowsCoreThreadTimeOut() Возвращает истину, если этот пул позволяет основным потокам истекать по тайм-ауту и завершаться, если в течение времени keepAlive не поступают никакие задачи, и заменяется при необходимости при поступлении новых задач. |
4 | boolean awaitTermination(long timeout, TimeUnit unit) Блокирует до тех пор, пока все задачи не завершат выполнение после запроса на завершение работы, или пока не истечет время ожидания, или пока текущий поток не будет прерван, в зависимости от того, что произойдет раньше. |
5 | protected void beforeExecute(Thread t, Runnable r) Метод, вызываемый перед выполнением данного Runnable в данном потоке. |
6 | void execute(Runnable command) Выполняет данную задачу когда-нибудь в будущем. |
7 | protected void finalize() Вызывает завершение работы, когда на этот исполнитель больше нет ссылки и у него нет потоков. |
8 | int getActiveCount() Возвращает приблизительное количество потоков, активно выполняющих задачи. |
9 | long getCompletedTaskCount() Возвращает приблизительное общее количество завершенных задач. |
10 | int getCorePoolSize() Возвращает основное количество потоков. |
11 | long getKeepAliveTime(TimeUnit unit) Возвращает время поддержания активности потока, то есть время, в течение которого потоки, размер которых превышает размер основного пула, могут оставаться в режиме ожидания перед завершением. |
12 | int getLargestPoolSize() Возвращает наибольшее количество потоков, которые когда-либо одновременно находились в пуле. |
13 | int getMaximumPoolSize() Возвращает максимально допустимое количество потоков. |
14 | int getPoolSize() Возвращает текущее количество потоков в пуле. |
15 | BlockingQueue
Возвращает очередь задач, используемую этим исполнителем. |
15 | RejectedExecutionHandler getRejectedExecutionHandler() Возвращает текущий обработчик невыполнимых задач. |
16 | long getTaskCount() Возвращает приблизительное общее количество задач, которые когда-либо были запланированы для выполнения. |
17 | ThreadFactory getThreadFactory() Возвращает фабрику потоков, используемую для создания новых потоков. |
18 | boolean isShutdown() Возвращает истину, если этот исполнитель был выключен. |
19 | boolean isTerminated() Возвращает истину, если все задачи были выполнены после завершения работы. |
20 | boolean isTerminating() Возвращает истину, если этот исполнитель находится в процессе завершения после shutdown () или shutdownNow (), но не завершился полностью. |
21 год | int prestartAllCoreThreads() Запускает все основные потоки, заставляя их бездействовать в ожидании работы. |
22 | boolean prestartCoreThread() Запускает основной поток, заставляя его бездействовать в ожидании работы. |
23 | void purge() Пытается удалить из рабочей очереди все будущие задачи, которые были отменены. |
24 | boolean remove(Runnable task) Удаляет эту задачу из внутренней очереди исполнителя, если она присутствует, в результате чего она не запускается, если она еще не запущена. |
25 | void setCorePoolSize(int corePoolSize) Устанавливает основное количество потоков. |
26 | void setKeepAliveTime(long time, TimeUnit unit) Устанавливает предел времени, в течение которого потоки могут оставаться в режиме ожидания до завершения. |
27 | void setMaximumPoolSize(int maximumPoolSize) Устанавливает максимально допустимое количество потоков. |
28 | void setRejectedExecutionHandler(RejectedExecutionHandler handler) Устанавливает новый обработчик невыполнимых задач. |
29 | void setThreadFactory(ThreadFactory threadFactory) Устанавливает фабрику потоков, используемую для создания новых потоков. |
30 | void shutdown() Инициирует упорядоченное завершение работы, при котором ранее отправленные задачи выполняются, но новые задачи не принимаются. |
31 год | List<Runnable> shutdownNow() Пытается остановить все активно выполняющиеся задачи, останавливает обработку ожидающих задач и возвращает список задач, ожидающих выполнения. |
32 | protected void terminated() Метод вызывается, когда Исполнитель завершает работу. |
33 | String toString() Возвращает строку, идентифицирующую этот пул, а также его состояние, включая индикацию состояния выполнения и предполагаемое количество рабочих и задач. |
пример
Следующая программа TestThread показывает использование интерфейса ThreadPoolExecutor в среде на основе потоков.
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestThread {
public static void main(final String[] arguments) throws InterruptedException {
ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newCachedThreadPool();
//Stats before tasks execution
System.out.println("Largest executions: "
+ executor.getLargestPoolSize());
System.out.println("Maximum allowed threads: "
+ executor.getMaximumPoolSize());
System.out.println("Current threads in pool: "
+ executor.getPoolSize());
System.out.println("Currently executing threads: "
+ executor.getActiveCount());
System.out.println("Total number of threads(ever scheduled): "
+ executor.getTaskCount());
executor.submit(new Task());
executor.submit(new Task());
//Stats after tasks execution
System.out.println("Core threads: " + executor.getCorePoolSize());
System.out.println("Largest executions: "
+ executor.getLargestPoolSize());
System.out.println("Maximum allowed threads: "
+ executor.getMaximumPoolSize());
System.out.println("Current threads in pool: "
+ executor.getPoolSize());
System.out.println("Currently executing threads: "
+ executor.getActiveCount());
System.out.println("Total number of threads(ever scheduled): "
+ executor.getTaskCount());
executor.shutdown();
}
static class Task implements Runnable {
public void run() {
try {
Long duration = (long) (Math.random() * 5);
System.out.println("Running Task! Thread Name: " +
Thread.currentThread().getName());
TimeUnit.SECONDS.sleep(duration);
System.out.println("Task Completed! Thread Name: " +
Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Это даст следующий результат.
Вывод
Largest executions: 0
Maximum allowed threads: 2147483647
Current threads in pool: 0
Currently executing threads: 0
Total number of threads(ever scheduled): 0
Core threads: 0
Largest executions: 2
Maximum allowed threads: 2147483647
Current threads in pool: 2
Currently executing threads: 2
Total number of threads(ever scheduled): 2
Running Task! Thread Name: pool-1-thread-2
Running Task! Thread Name: pool-1-thread-1
Task Completed! Thread Name: pool-1-thread-1
Task Completed! Thread Name: pool-1-thread-2