Tworzenie stałej liczby watków

0

Hej w treści zadania do wykonania mam takie założenia;

  • uzytkownik podaje na ilu watkach ma byc uruchamiana aplikacja
  • zadanie ma byc wykonanie przy uzyciu wszystkich watkow
  • NIE mozna stworzyc wiecej watkow niz podane przez uzytkownika

Na poczatku myślałam o

 ExecutorService executorService = Executors.newFixedThreadPool(threadsNumber);

Aczkolwiek jezeli ustawie ze mam do wykonania 100 taskow to tak naprawde utworzy sie 100 watkow, tyle ze nie jednoczesnie.

0

Dobra, ale to zadanie na czym dokładnie ma polegać?

0
Vanilka napisał(a):
 ExecutorService executorService = Executors.newFixedThreadPool(threadsNumber);

Aczkolwiek jezeli ustawie ze mam do wykonania 100 taskow to tak naprawde utworzy sie 100 watkow, tyle ze nie jednoczesnie.

Bez zabawek typu CUDA nie utworzysz stu wątków jednocześnie bo ogranicza cię liczba rdzeni.
IMO jeśli nie robisz jakichś mega skomplikowanych rzeczy to ten sposób ci wystarczy.

0
wartek01 napisał(a):
Vanilka napisał(a):
 ExecutorService executorService = Executors.newFixedThreadPool(threadsNumber);

Aczkolwiek jezeli ustawie ze mam do wykonania 100 taskow to tak naprawde utworzy sie 100 watkow, tyle ze nie jednoczesnie.

Bez zabawek typu CUDA nie utworzysz stu wątków jednocześnie bo ogranicza cię liczba rdzeni.
IMO jeśli nie robisz jakichś mega skomplikowanych rzeczy to ten sposób ci wystarczy.

Chodzi mi bardziej o to, że mając te 100 taskow, i thrread pool na 10, to najpierw utworzy sie 10, i jak ktorys sie ubije, to utworzy sie nowy w jego miejsce. I nie do konca jestem pewna, czy własnie o to chodzi w zadaniu. ( nie wiadomo jak to będzie weryfikowane).

Taj dokladnie jest sformulowane to zastrzezenie :

Liczba wątków, które można utworzyć jest ograniczona. Nie wolno używać większej niż podana liczby wątków.

0
Vanilka napisał(a):

Taj dokladnie jest sformulowane to zastrzezenie :

Liczba wątków, które można utworzyć jest ograniczona. Nie wolno używać większej niż podana liczby wątków.

Powiedziałbym, że właśnie chodzi o to, żeby używać Executors.newFixedThreadPool zamiast po prostu tworzyć nowe wątki za pomocą Thread::new (nieograniczona liczba wątków).

Ale jeśli już NAPRAWDĘ chcesz to użyj Executors.newCachedThreadPool. Zgodnie z opisem:
"Creates a thread pool that creates new threads as needed, but will reuse previously constructed threads when they are available."

2

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 :)

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