Klasa ThreadPoolExecutor

java.util.concurrent.ThreadPoolExecutor to usługa ExecutorService służąca do wykonywania każdego przesłanego zadania przy użyciu jednego z prawdopodobnie kilku wątków w puli, zwykle konfigurowanych przy użyciu metod fabrycznych modułów wykonawczych. Udostępnia również różne metody narzędziowe do sprawdzania aktualnych statystyk wątków i kontrolowania ich.

Metody ThreadPoolExecutor

Sr.No. Metoda i opis
1

protected void afterExecute(Runnable r, Throwable t)

Metoda wywoływana po zakończeniu wykonywania danego Runnable.

2

void allowCoreThreadTimeOut(boolean value)

Ustawia zasady określające, czy główne wątki mogą przekroczyć limit czasu i zakończyć się, jeśli żadne zadania nie nadejdą w czasie utrzymywania aktywności, i są zastępowane w razie potrzeby, gdy nadejdą nowe zadania.

3

boolean allowsCoreThreadTimeOut()

Zwraca wartość true, jeśli ta pula pozwala wątkom rdzeniowym na przekroczenie limitu czasu i zakończenie, jeśli żadne zadania nie nadejdą w czasie keepAlive, i są zastępowane w razie potrzeby, gdy nadejdą nowe zadania.

4

boolean awaitTermination(long timeout, TimeUnit unit)

Blokuje do momentu zakończenia wykonywania wszystkich zadań po żądaniu zamknięcia systemu, przekroczenia limitu czasu lub przerwania bieżącego wątku, w zależności od tego, co nastąpi wcześniej.

5

protected void beforeExecute(Thread t, Runnable r)

Metoda wywołana przed wykonaniem danego Runnable w danym wątku.

6

void execute(Runnable command)

Wykonuje dane zadanie w przyszłości.

7

protected void finalize()

Wywołuje zamknięcie, gdy ten moduł wykonawczy nie jest już przywoływany i nie ma wątków.

8

int getActiveCount()

Zwraca przybliżoną liczbę wątków, które aktywnie wykonują zadania.

9

long getCompletedTaskCount()

Zwraca przybliżoną całkowitą liczbę zadań, które zakończyły wykonywanie.

10

int getCorePoolSize()

Zwraca podstawową liczbę wątków.

11

long getKeepAliveTime(TimeUnit unit)

Zwraca czas utrzymywania aktywności wątku, czyli czas, przez jaki wątki przekraczające rozmiar puli rdzenia mogą pozostawać bezczynne przed zakończeniem.

12

int getLargestPoolSize()

Zwraca największą liczbę wątków, które kiedykolwiek były jednocześnie w puli.

13

int getMaximumPoolSize()

Zwraca maksymalną dozwoloną liczbę wątków.

14

int getPoolSize()

Zwraca bieżącą liczbę wątków w puli.

15

BlockingQueue getQueue()

Zwraca kolejkę zadań używaną przez ten moduł wykonawczy.

15

RejectedExecutionHandler getRejectedExecutionHandler()

Zwraca bieżącą procedurę obsługi dla niewykonalnych zadań.

16

long getTaskCount()

Zwraca przybliżoną całkowitą liczbę zadań, które kiedykolwiek zostały zaplanowane do wykonania.

17

ThreadFactory getThreadFactory()

Zwraca fabrykę wątków używaną do tworzenia nowych wątków.

18

boolean isShutdown()

Zwraca wartość true, jeśli ten moduł wykonawczy został zamknięty.

19

boolean isTerminated()

Zwraca wartość true, jeśli wszystkie zadania zostały zakończone po zamknięciu.

20

boolean isTerminating()

Zwraca wartość true, jeśli ten moduł wykonujący jest w trakcie kończenia działania po shutdown () lub shutdownNow (), ale nie został całkowicie zakończony.

21

int prestartAllCoreThreads()

Uruchamia wszystkie podstawowe wątki, powodując, że bezczynnie czekają na pracę.

22

boolean prestartCoreThread()

Uruchamia główny wątek, powodując bezczynne oczekiwanie na pracę.

23

void purge()

Próbuje usunąć z kolejki roboczej wszystkie zadania w przyszłości, które zostały anulowane.

24

boolean remove(Runnable task)

Usuwa to zadanie z wewnętrznej kolejki executora, jeśli jest obecne, powodując w ten sposób, że nie jest uruchamiane, jeśli nie zostało jeszcze uruchomione.

25

void setCorePoolSize(int corePoolSize)

Ustawia podstawową liczbę wątków.

26

void setKeepAliveTime(long time, TimeUnit unit)

Ustawia limit czasu, przez który wątki mogą pozostawać bezczynne przed zakończeniem.

27

void setMaximumPoolSize(int maximumPoolSize)

Ustawia maksymalną dozwoloną liczbę wątków.

28

void setRejectedExecutionHandler(RejectedExecutionHandler handler)

Ustawia nową procedurę obsługi dla niewykonalnych zadań.

29

void setThreadFactory(ThreadFactory threadFactory)

Ustawia fabrykę gwintów używaną do tworzenia nowych wątków.

30

void shutdown()

Inicjuje uporządkowane zamknięcie, w którym wykonywane są wcześniej przesłane zadania, ale żadne nowe zadania nie będą akceptowane.

31

List<Runnable> shutdownNow()

Próbuje zatrzymać wszystkie aktywnie wykonywane zadania, zatrzymuje przetwarzanie zadań oczekujących i zwraca listę zadań oczekujących na wykonanie.

32

protected void terminated()

Metoda wywoływana po zakończeniu działania modułu Executor.

33

String toString()

Zwraca ciąg identyfikujący tę pulę, a także jej stan, w tym wskazania stanu uruchomienia oraz szacowaną liczbę pracowników i zadań.

Przykład

Poniższy program TestThread przedstawia użycie interfejsu ThreadPoolExecutor w środowisku opartym na wątkach.

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();
         }
      }
   }
}

Spowoduje to następujący wynik.

Wynik

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