/ / Existuje predvolená oblasť vlákien v jave - java, multithreading

Je predvolené vlákno bazéne v java - java, multithreading

Môžem vytvoriť nový vlákno pool v Java a vykonávať úlohy na ňom pomocou ExecutorService.newFixedThreadPool a ExecutorService.submit metódy.

Existuje „predvolená“ oblasť vlákien, ktoré môžem znova použiťpre všetky vykonávateľské služby v mojom programe java? Alebo musím iba vytvoriť singleton, ktorý obsahuje predvolenú skupinu nití? C # má predvolenú skupinu vlákien, ktorá spúšťa úlohy, keď Task.Factory.StartNew metóda sa nazýva.

odpovede:

5 pre odpoveď č. 1

Používanie samostatných skupín vlákien je dobré, predvolená prax a zdieľanie oblasti vlákien je (pravdepodobne predčasnou) optimalizáciou.

Prostredníctvom Java 7 je odpoveď nie, neexistujePredvolená oblasť vlákien a odporúčame mať veľa oblastí vlákien. Je to dobré oddelenie a zabráni tomu, aby správanie pri blokovaní správania pri jednej kolekcii zasahovalo do inej.

Ak zdieľate spoločnú diskusnú skupinu, mali by ste sa opýtať napríklad:

  • Bude logovací rámec schopný rozlíšiť úlohy? (Vlákna sú jedným zo spôsobov, ako rozlíšiť.)
  • Ak oblasť úloh A omylom požiada o príliš veľa vlákien a bude prerušená, mala by oblasť úloh B hladovať? Ak zistíte, že oblasť úloh B zlyhá, budete schopní diagnostikovať problém v skupine úloh A?
  • Ak by blok A mal hladovať?

Možno vytvoríte niečo ako a LightweightThreadpool. A prvých 5 úloh, ktoré napíšete, ju použije v aľahká móda. A 6. úloha ... robí, až na to, že tiež zapisuje chyby na disk, a tie chyby sú prekvapivo veľké a niekedy ich je veľa a nie sú škrtené. Prvých 5 úloh zrazu vyhladovalo a vôbec netuší, čo ich zasiahlo, a navyše, keď ste tieto úlohy písali, skutočne ste verili, že sú bezpečné a možno sa na tento typ incidentu nepripravili.

Zdieľanie threadpoolov je teda asi také dobré ako maťdva rôzne procesy spustené na rovnakom serveri sú v poriadku. Najprv by ste mali veľmi starostlivo premýšľať o správe zdrojov a pochopiť, že úlohy sú teraz spojené so zdrojmi. Nedostatok predvoleného súboru vlákien sa vás snaží prinútiť, aby ste predvolene používali samostatné súbory a pred zdieľaním si tieto otázky dobre premyslite.

Od verzie Java 8 je odpoveď „áno“ (za Tagirova odpoveď na túto otázku). Ale všimnete si, že všetko začne strašne zlyhávať, ak do tejto skupiny vlákien zadáte úlohy blokovania.


9 pre odpoveď č. 2

Od verzie Java-8 existuje ForkJoinPool.commonPool() ktorý je predvolene používaný mnohými metódami zahŕňajúcimi paralelné alebo asynchrónne vykonávanie. Napríklad, Arrays.parallelSort() alebo paralelná prevádzka Stream API používajú tento fond. Do tohto fondu môžete zadávať svoje vlastné úlohy pomocou mnohých metód CompletableFuture trieda ako CompletableFuture.supplyAsync().