ThreadPoolExecutor - 1

"Almindelige programmører får før eller siden styr på, at de har mange små opgaver, der skal udføres fra tid til anden."

"Hvis du skriver et spil, så er det de handlinger, som individuelle karakterer udfører."

"Hvis du skriver en webserver, så er det forskellige kommandoer, der kommer ind fra brugere: upload et billede, omkode det til det ønskede format, anvend den ønskede skabelon osv."

"Før eller siden bliver alle store opgaver delt op i et sæt små, overskuelige opgaver."

"Så, givet denne kontekst, opstår der et subtilt spørgsmål: hvordan skal du administrere dem alle? Hvad hvis du skal udføre flere hundrede opgaver på et minut? At oprette en tråd for hver opgave ville ikke give meget mening. Java-maskinen allokerer ret mange ressourcer til hver tråd."

"Med andre ord kan det tage mere tid og ressourcer at oprette og ødelægge en tråd end selve opgaven."

"Javas skabere kom med en elegant løsning på dette problem: ThreadPoolExecutor .

" ThreadPoolExecutor er en klasse med to ting indeni:"

A)  En opgavekø, som du kan tilføje opgave til, efterhånden som de opstår i programmet.

B) En trådpulje, som er en gruppe af tråde, der udfører disse opgaver.

"Hvad mere er, så bliver trådene ikke ødelagt, når først en opgave er færdig. I stedet falder de i søvn for at være klar til at starte en ny opgave, så snart den dukker op."

"Når du opretter en ThreadPoolExecutor , kan du indstille det maksimale antal tråde, der skal oprettes, og det maksimale antal opgaver, der kan sættes i kø. Du kan med andre ord begrænse antallet af tråde til f.eks. 10, og antallet af stillede opgaver i kø til 100."

"Sådan fungerer ThreadPoolExecutor :"

1)  Når du tilføjer en ny opgave, placeres den i slutningen af ​​køen.

2)  Hvis køen er fuld, kastes en undtagelse.

3)  Når en opgave er fuldført, tager hver tråd den næste opgave fra køen og begynder at udføre den.

4) Hvis der ikke er opgaver i køen, går en tråd i dvale indtil nye opgaver tilføjes.

"Tilgangen, hvor vi begrænser antallet af arbejdertråde, er fordelagtig ved, at jo flere tråde vi har, jo mere forstyrrer de hinanden. Det er meget mere effektivt at have 5-10 arbejdertråde og en lang kø af opgaver end at skabe 100 tråde til en bølge af opgaver, som vil konkurrere med hinanden om ressourcer: hukommelse, processortid, databaseadgang osv."

"Her er et eksempel på ThreadPoolExecutor i aktion:"

Eksempel
ExecutorService service = Executors.newFixedThreadPool(2);

for(int i = 0; i < 10; i++)
{
 service.submit(new Runnable() {
    public void run()
    {
     // Here we download something big from the Internet.
    }
 });
}

"Øh, jeg kan ikke se det..."

"Et ThreadPoolExecutor- objekt oprettes, når metoden newFixedThreadPool kaldes."

Så det er meget nemt at bruge. Så snart du tilføjer en opgave til den med indsendelsesmetoden, gør den:

A)  vækker en sovende tråd, hvis der er en, for at udføre opgaven.

B)  Hvis der ikke er nogen ventende tråd, opretter den en ny til opgaven.

C)  Hvis det maksimale antal tråde er nået, så sætter den blot opgaven i slutningen af ​​køen.

"Jeg har bevidst inkluderet «her downloader vi noget stort fra internettet» i eksemplet. Hvis vi har 100 opgaver «download noget stort fra internettet», så giver det ingen mening at køre mange af dem på samme tid—vi' vil blive holdt tilbage af båndbreddegrænsen for vores internetforbindelse. I dette tilfælde burde et par tråde være nok. Dette er, hvad du ser i eksemplet ovenfor:"

ExecutorService service = Executors.newFixedThreadPool(2);

"Det viser sig, at det ikke er så svært at arbejde med en masse opgaver."

"Ja. Endnu nemmere, end du måske forestiller dig. Men Kim vil fortælle dig om det."