Po kolei. newFixedThreadPool
utworzy maksymalnie tyle wątków ile podasz w parametrze. Będą sobie siedziały w kolejce i czekały na zadania. Jeżeli jakiś wątek wybuchnie (bo coś poleci w zadaniu), to zostanie zastąpiony nowym. Wątki są tworzone leniwie, czyli jak podasz Integer.MAX_INT
, to nie utworzy 2mld wątków od razu.
Liczba jednocześnie uruchomionych wątków jest ograniczona do liczby FIZYCZNYCH procesorów. Jeżeli CPU wspiera hyperthreading, to można mieć uruchomione więcej wątków, ale pod warunkiem, że część z nich czeka na operacje IO i nie potrzebuje mocy obliczeniowej jako takiej (nie pracuje z ALU i kolegami).
I teraz treść zadania. Użytkownik podaje ile wątków chce utworzyć. OK, mamy newFixedThreadPool
i to zaspokaja punkt pierwszy i ostatni. Problem jest z punktem drugim, bo oczywistym ograniczeniem jest liczba dostępnych CPU. W efekcie nie będzie można spełnić tego punktu jeżeli użytkownik poda liczbę większą niż liczba CPU. Rozwiązaniem jest jakieś ostrzeżenie jak podajemy za dużą liczbę.
ps. ostrzeżenie jest oczywiście bez sensu, bo po uruchomieniu procesu JVM można za pomocą taskset
ograniczyć liczbę wykorzystywanych rdzeni :)