ThreadPoolExecutor - 1

"Vanlige programmerere kommer før eller siden inn i at de har mange små oppgaver som må utføres fra tid til annen."

"Hvis du skriver et spill, så er det handlingene som individuelle karakterer utfører."

"Hvis du skriver en webserver, så er det forskjellige kommandoer som kommer inn fra brukere: last opp et bilde, omkode det til ønsket format, bruk ønsket mal, osv."

"Før eller siden blir alle store oppgaver delt opp i et sett med små, håndterbare oppgaver."

"Så, gitt denne konteksten, oppstår et subtilt spørsmål: hvordan skal du administrere dem alle? Hva om du trenger å utføre flere hundre oppgaver på et minutt? Å lage en tråd for hver oppgave ville ikke gi mye mening. Java-maskinen tildeler ganske mye ressurser for hver tråd."

"Med andre ord, å opprette og ødelegge en tråd kan ta mer tid og ressurser enn selve oppgaven."

"Javas skapere kom opp med en elegant løsning på dette problemet: ThreadPoolExecutor .

" ThreadPoolExecutor er en klasse med to ting inni:"

A)  En oppgavekø, som du kan legge til oppgave i etter hvert som de oppstår i programmet.

B) En trådpool, som er en gruppe tråder som utfører disse oppgavene.

"I tillegg blir ikke trådene ødelagt når en oppgave er fullført. I stedet sovner de for å være klare til å starte en ny oppgave så snart den dukker opp."

"Når du oppretter en ThreadPoolExecutor , kan du angi maksimalt antall tråder som skal opprettes og maksimalt antall oppgaver som kan settes i kø. Med andre ord kan du begrense antall tråder til for eksempel 10 og antall satte oppgaver i kø til 100."

"Slik fungerer ThreadPoolExecutor :"

1)  Når du legger til en ny oppgave, plasseres den på slutten av køen.

2)  Hvis køen er full, kastes et unntak.

3)  Etter å ha fullført en oppgave, tar hver tråd den neste oppgaven fra køen og begynner å utføre den.

4) Hvis det ikke er noen oppgaver i køen, går en tråd i dvale til nye oppgaver legges til.

"Tilnærmingen, der vi begrenser antall arbeidertråder, er fordelaktig ved at jo flere tråder vi har, jo mer forstyrrer de hverandre. Det er mye mer effektivt å ha 5-10 arbeidertråder og lang kø med oppgaver enn å lage 100 tråder for en bølge av oppgaver, som vil konkurrere med hverandre om ressurser: minne, prosessortid, databasetilgang, etc."

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

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 ser det ikke..."

"Et ThreadPoolExecutor- objekt opprettes når newFixedThreadPool-metoden kalles."

Så det er veldig enkelt å bruke. Så snart du legger til en oppgave med innsendingsmetoden, gjør den:

A)  Vekker en sovende tråd, hvis det er en, for å utføre oppgaven.

B)  Hvis det ikke er noen ventende tråd, oppretter den en ny for oppgaven.

C)  Hvis det maksimale antallet tråder er nådd, så setter den ganske enkelt oppgaven på slutten av køen.

"Jeg inkluderte bevisst «her laster vi ned noe stort fra Internett» i eksempelet. Hvis vi har 100 oppgaver «laster ned noe stort fra Internett», så gir det ingen mening å kjøre mange av dem samtidig—vi' vil bli holdt tilbake av båndbreddegrensen for Internett-tilkoblingen vår. I dette tilfellet bør et par tråder være nok. Dette er hva du ser i eksemplet ovenfor:"

ExecutorService service = Executors.newFixedThreadPool(2);

"Det viser seg at det ikke er så vanskelig å jobbe med en haug med oppgaver."

"Ja. Enda enklere enn du kanskje tror. Men Kim vil fortelle deg om det."