Próbuję zakodować rozwiązanie, w którym pojedynczy wątek wytwarza zadania intensywnie korzystające z operacji we / wy, które można wykonywać równolegle. Każde zadanie ma znaczące dane w pamięci. Dlatego chcę mieć możliwość ograniczenia liczby zadań oczekujących w danej chwili.
Jeśli utworzę ThreadPoolExecutor w ten sposób:
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQueue));
Potem executor.submit(callable)
rzucaRejectedExecutionException
gdy kolejka się zapełni i wszystkie wątki są już zajęte.
Co mogę zrobić executor.submit(callable)
blok, gdy kolejka jest pełna i wszystkie wątki są zajęte?
EDYCJA : próbowałem tego :
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
I w pewnym stopniu osiąga efekt, który chcę osiągnąć, ale w nieelegancki sposób (w zasadzie wątki odrzucone są uruchamiane w wątku wywołującym, więc blokuje to wątek wywołujący przed przesłaniem większej liczby).
EDYCJA: (5 lat po zadaniu pytania)
Każdemu, kto czyta to pytanie i odpowiedzi na nie, nie traktuj zaakceptowanej odpowiedzi jako jednego prawidłowego rozwiązania. Przeczytaj wszystkie odpowiedzi i komentarze.