kdlug
2/12/2020 - 12:22 PM

Thread Executors

ExecutorService
Aby zrównoleglić wykonywanie zadań musimy przygotować pulę wątków. Najczęściej robimy to dzięki wykorzystaniu klasy Executors:
ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads);

Executors - posiada metody statyczne do tworzeni puli wątków.

Executors.newSingleThreadExecutor() - pojedynczy wyjatek
Executors.newFixedThreadPool(int numberOfThreads) - określona ilość wyjątków
Executors.newCachedThreadPool() -Jest to pula, która nie ma określonego rozmiaru. Jeśli potrzebuje ona kolejnych wątków, po prostu je tworzy. Jeśli któryś z wątków zakończył swoją prace, będzie on użyty ponownie. Jeśli jakiś wątek jest “bezrobotny” powyżej 60 sekund, jest zamykany i usuwany z puli. Dzięki temu mamy pewność, iż w odpowiedni sposób wykorzystujemy zasoby. Pula ta idealnie nadaje się do krótkich zadań, ponieważ nowe wątki nie są tworzone, a jedynie reużywane z istniejącej już puli.
Executors.newScheduledThreadPool(int numberOfThreads) - pozwala odpalić zadania z opóźnieniem, 

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
ScheduledFuture<String> schedule = scheduledExecutorService.schedule(myTask, 10, TimeUnit.SECONDS);
schedule.get(); // result after 10 second

ThreadFactory jak sama nazwa mówi jest fabryką pomocniczą do tworzenia wątków. 

ThreadFactory factory = new ThreadFactoryBuilder()
        .setNameFormat("task-name-%d") // format dla nazwy watku (domyslnie pool-n-thread-m)
        .setDaemon(true) 
        .build();
ExecutorService executorService = Executors.newFixedThreadPool(numberOfThread, factory);

Dzięki temu nasz zrzut wątków może wyglądać zamiast:
pool-1-thread-2
pool-2-thread-3
pool-1-thread-0
pool-3-thread-1
pool-3-thread-2
pool-1-thread-1

w nastepujący sposób:
importing-logs-2
some-operation-3
importing-logs-0
reading-from-db-1
reading-from-db-2
importing-logs-1