Thread pool on itse asiassa pooling-teknologian toteutus Pooling-tekniikan ydinajatus on toteuttaa resurssien uudelleenkäyttö ja välttää resurssien toistuvasta luomisesta ja tuhoamisesta aiheutuvat ylimääräiset suorituskustannukset. Säiepooli voi hallita joukkoa säiettä niin, että säikeet eivät tuhoudu tehtävän suorittamisen jälkeen, vaan jatkavat muiden säikeiden lähettämien tehtävien käsittelyä.
Lankapoolin käytön edut
Vähennä resurssien kulutusta. Vähennä säikeiden luomisen ja tuhoamisen kustannuksia käyttämällä luotuja säikeitä uudelleen.
Paranna vastenopeutta. Kun tehtävä saapuu, tehtävä voidaan suorittaa välittömästi odottamatta säikeen luomista.
Paranna säikeen hallittavuutta. Säikeet ovat niukkoja resursseja Jos ne luodaan ilman rajoituksia, ne eivät vain kuluta järjestelmän resursseja, vaan heikentävät myös järjestelmän vakautta.
Rakenneparametrit
corePoolSize: käytetään työhön säiepoolissaYdinlankojen lukumäärä。
altaan maksimikoko:Lankojen enimmäismäärä , lankojen enimmäismäärä, jonka säievarasto voi luoda. Kun säikeen määrä saavuttaa corePoolSize-arvon, jos tehtäväjono on täynnä ja uusia tehtäviä on käsiteltävä, säievarasto luo uusia säikeitä (mutta kokonaismäärä ei ylitä maximumPoolSizea) näiden tehtävien käsittelemiseksi. (Tämä vastaa sitä, kun jonoalue on täynnä, seuraavat säikeet voivat hypätä suoraan jonoon.) Jos tehtävien määrä ylittää maximumPoolSize-arvon ja tehtäväjono on täynnä, säiepooli käsittelee nämä suorittamattomat tehtävät hylkäyskäytännön mukaisesti.
keepAliveTime: corePoolSize- tai kaikki säikeet ylittymisen jälkeen luotujen säikeiden selviytymisaikaMaksimi selviytymisaikakokoonpanosta riippuen.
yksikkö: KeepAliveTime 的aikayksikkö。
työjono:tehtäväjono , on estojono Kun säikeiden määrä saavuttaa ydinsäikeiden määrän, tehtävä tallennetaan estojonoon. Yleiset toteutukset: BlockingQueue-rajapinnan toteutusluokat, kuten ArrayBlockingQueue, LinkedBlockingQueue jne.
threadFactory: käytetään säikeiden luomiseen lankavarannon sisällätehdas。
käsittelijä:Kiellä politiikka;Kun jono on täynnä ja säikeiden määrä saavuttaa säikeiden enimmäismäärän, tätä menetelmää kutsutaan käsittelemään tehtävä.
Kuinka asettaa parametrit
1. Määritä ydinsäikeiden lukumäärä (corePoolSize)
Prosessoriintensiiviset tehtävät: Prosessoria vaativissa tehtävissä on yleistä asettaa ydinsäikeiden lukumäärä 1-2 kertaa suorittimen ytimien lukumäärään verrattuna. Tämä varmistaa suorittimen resurssien täyden käytön välttäen samalla liiallisia kontekstin vaihtoja.
IO-intensiiviset tehtävät: IO-intensiivisiin tehtäviin, koska säikeet eivät vie CPU:ta odottaessaan IO-toimintoja, voidaan asettaa lisää ydinsäikiä. Yleisesti ottaen ydinsäikeiden lukumäärä voidaan asettaa yli 2 kertaa CPU-ytimien lukumäärään verrattuna, jotta voidaan käsitellä enemmän tehtäviä odottaessa IO:ta.
Sekatehtävät: Jos sovelluksesi sisältää sekä prosessoria vaativia että IO-intensiivisiä tehtäviä, sinun on tasapainotettava ydinsäikeiden lukumäärän asetukset erityistilanteen mukaan.
Resurssirajoitetut ympäristöt: Resurssirajoitteisissa ympäristöissä (kuten sulautetuissa järjestelmissä tai pilvipalvelimissa) säikeiden enimmäismäärää on rajoitettava, jotta estetään liian monet säikeet varaamasta resursseja.
Korkean samanaikaisuuden järjestelmä: Järjestelmissä, joiden on käsiteltävä suuri määrä samanaikaisia pyyntöjä, säikeiden enimmäismäärää voidaan lisätä asianmukaisesti järjestelmän samanaikaisten käsittelyominaisuuksien parantamiseksi. Kierteiden enimmäismäärän asettaminen tulee kuitenkin harkita kokonaisvaltaisesti järjestelmän kuormituskyvyn ja resurssiolosuhteiden perusteella.
3. Aseta säikeen joutoaika (keepAliveTime)
Prosessoriintensiiviset sovellukset: Prosessoria vaativissa sovelluksissa voit yleensä asettaa säikeen joutoajan lyhyemmäksi arvoksi, koska suorittimen resurssit ovat erittäin arvokkaita ja et halua liian monen tyhjäkäynnin säikeiden varaavan resursseja. Joissakin tapauksissa se voidaan jopa asettaa 0:ksi, mikä tarkoittaa, että ei-ydinsäikeitä ei säilytetä.
IO-intensiiviset sovellukset: IO-intensiivisissä sovelluksissa, koska säikeet eivät vie CPU-resursseja odottaessaan IO-toimintoja, säikeen joutoaika voidaan asettaa pidemmäksi arvoksi (esimerkiksi yli 1 minuutti), jotta vältetään toistuva säikeen käynnistyminen ja tuhoutuminen. .
4. Valitse tehtäväjono (workQueue)
rajoitettu jono : Rajatun jonon käyttö voi rajoittaa jonossa olevien tehtävien odotusaikaa ja välttää liian monista tehtävistä johtuvan muistin ylivuodon. Jos jonon pituus on kuitenkin asetettu liian pieneksi, tehtävät voidaan hylätä. (Yleensä valitaan rajoitettu jono)
Rajoittamaton jono: Rajoittamattoman jonon käyttäminen voi tallentaa kaikki tehtävät välimuistiin mahdollisimman paljon, mutta sinun on kiinnitettävä huomiota muistinkulutusongelmiin. Jos käytetään rajoittamatonta jonoa, säievarannon enimmäismäärä säiettä -parametri saattaa olla virheellinen, koska säievarasto ei yritä luoda uusia säikeitä käsitelläkseen jonossa olevia tehtäviä.
5. Määritä lankatehdas (threadFactory)
Säiketehdasta käytetään uusien säikeiden luomiseen. Mukautamalla säiketehdasta voit asettaa säikeen prioriteetin, demonin säikeen tilan ja muut attribuutit, ja voit myös asettaa säikeelle merkityksellisen nimen helpottaaksesi ongelmien diagnosointia JVM:ssä.
6. Määritä hylkäyskäytäntö (käsittelijä)
Kun säievarasto ei pysty käsittelemään uusia tehtäviä (eli säikeiden määrä on saavuttanut enimmäiskoon PoolSize ja tehtäväjono on täynnä), hylkäyskäytäntö on määritettävä käsittelemään näitä ei-suorita tehtäviä.Yleisiä hylkäysstrategioita ovat mmTee poikkeus suoraan、Käytä soittajan säiettä tehtävän suorittamiseen、Ohita uudet tehtävät ja hylkää vanhimmat tehtävät jonossa odota. Voit myös muokata hylkäyskäytäntöä tarpeen mukaan.