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