Work stealing

0

Próbuję zrozumieć, jak działa work stealing w Javie. Czy mógłby ktoś powiedzieć, czy dobrze myślę?

W executorze otrzymanym z Executors.newFixedThreadPool(...) jest tak, że jeśli nowe zadanie trafia do executora i wszystkie wątki są zajęte, to executor ustawia je w kolejce do tak jakby następnego wątku na liście. Jeśli któryś z wątków skończy pracę wcześniej niż ten, do którego trafiło zadanie, to nic się nie stanie - zadanie dalej będzie czekało aż skończy pracować ten wątek, do którego zostało przydzielone. W executorze otrzymanym z Executors.newWorkStealingPool(...) zadanie jest przydzielane w ten sam sposób, z tymże jeśli któryś z wątków skończy wcześniej, to ten wątek może przejąć to zadanie.

0

Jeśli któryś z wątków skończy pracę wcześniej niż ten, do którego trafiło zadanie, to nic się nie stanie - zadanie dalej będzie czekało aż skończy pracować ten wątek, do którego zostało przydzielone

Nie, zadanie nie trafia do wątku tylko do kolejki współdzielonej przez daną pulę (wszystkie wątki z puli).
Executors.newWorkStealingPool(...) pod spodem tworzy ForkJoinPool, który jest chyba od Javy 7 i polega to na tym, że każdy wątek ma swoją kolejkę i jeżeli wątek X wykona wszystkie zadania ze swojej kolejki to może wziąć zadania z kolejki wątku Y. Poza tym jest wsparcie do zadań, które można podzielić na mniejsze i rozdzielić między wątki, o tym szerzej możesz poczytać www.baeldung.com/java-fork-join

1 użytkowników online, w tym zalogowanych: 0, gości: 1