Używam architektury Executors
w Javie do tworzenia pul wątków dla aplikacji wielowątkowej, a ja mam pytanie dotyczące wydajności.Optymalny sposób tworzenia puli wątków o stałym rozmiarze w Javie przy użyciu usługi Executors
Mam aplikację, która może pracować w trybie rzeczywistym lub w czasie innym niż rzeczywisty. W przypadku, gdy jest to w czasie rzeczywistym, ja po prostu przy użyciu następujących:
THREAD_POOL = Executors.newCachedThreadPool();
ale w przypadku nie jest to w czasie rzeczywistym, chcę zdolność do kontrolowania wielkości mojego puli wątków. Aby to zrobić, myślę o 2 opcjach, ale tak naprawdę nie rozumiem różnicy i która z nich byłaby lepsza.
Wariant 1 jest użycie prosty sposób:
THREAD_POOL = Executors.newFixedThreadPool(threadPoolSize);
Wariant 2 jest tworzyć własne ThreadPoolExecutor
takiego:
RejectedExecutionHandler rejectHandler = new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
executor.getQueue().put(r);
} catch (Exception e) {}
}
};
THREAD_POOL = new ThreadPoolExecutor(threadPoolSize, threadPoolSize, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(10000), rejectHandler);
Chciałbym zrozumieć, co jest zaletą przy użyciu bardziej złożoną opcję 2, a także gdybym użył innej struktury danych niż LinkedBlockingQueue
? Każda pomoc będzie doceniona.
'RejectedExecutionHandler' rzeczywiście blokuje, wywołanie' executor.getQueue() put (R); 'blokuje aż kolejka uwalnia się, tzw. w końcu mój handler pozwala zachować ograniczoną kolejkę bez przerywania jakiegokolwiek zadania. O ile się nie mylę. +1 dla innych szczegółów. –
@CharlesMenguy: dziękuję za wyjaśnienia, moje złe, zaktualizuję moje pytanie. Ale co chcesz osiągnąć przez blokowanie wewnątrz 'RejectedExecutionHandler'? Wierzę, że może mieć naprawdę nieoczekiwane efekty uboczne, takie jak blokowanie wątku wywołującego. Może potrzebujesz 'CallerRunsPolicy'? –
Właściwie po obejrzeniu tego, 'CallerRunsPolicy' brzmi naprawdę obiecująco dla tego, co chcę zrobić, spróbuję dzięki! Może możesz to dodać w odpowiedzi, a ja przyjmuję twoją odpowiedź. –