ThreadPoolExecutor - 1

"Vanliga programmerare får förr eller senare grepp om att de har många små uppgifter som behöver utföras då och då."

"Om du skriver ett spel, då är det handlingarna som enskilda karaktärer utför."

"Om du skriver en webbserver så är det olika kommandon som kommer in från användare: ladda upp ett foto, koda om det till önskat format, använd önskad mall, etc."

"Förr eller senare delas alla stora uppgifter upp i en uppsättning små, hanterbara uppgifter."

"Så, med tanke på detta sammanhang, uppstår en subtil fråga: hur ska du hantera dem alla? Tänk om du behöver utföra flera hundra uppgifter på en minut? Att skapa en tråd för varje uppgift skulle inte vara mycket meningsfullt. Java-maskinen tilldelar ganska mycket resurser för varje tråd."

"Med andra ord, att skapa och förstöra en tråd kan ta mer tid och resurser än själva uppgiften."

"Javas skapare kom på en elegant lösning på detta problem: ThreadPoolExecutor .

" ThreadPoolExecutor är en klass med två saker inuti:"

A)  En uppgiftskö, som du kan lägga till uppgift till när de uppstår i programmet.

B) En trådpool, som är en grupp trådar som utför dessa uppgifter.

"Dessutom förstörs inte trådarna när en uppgift är klar. Istället somnar de för att vara redo att påbörja en ny uppgift så fort den dyker upp."

"När du skapar en ThreadPoolExecutor kan du ställa in det maximala antalet trådar som ska skapas och det maximala antalet uppgifter som kan köas. Med andra ord kan du begränsa antalet trådar till t.ex. 10 och antalet köade uppgifter till 100."

"Så här fungerar ThreadPoolExecutor :"

1)  När du lägger till en ny uppgift placeras den i slutet av kön.

2)  Om kön är full kastas ett undantag.

3)  När en uppgift är klar, tar varje tråd nästa uppgift från kön och börjar köra den.

4) Om det inte finns några uppgifter i kön går en tråd i viloläge tills nya uppgifter läggs till.

"Tillvägagångssättet, där vi begränsar antalet arbetartrådar, är fördelaktigt genom att ju fler trådar vi har, desto mer stör de varandra. Det är mycket effektivare att ha 5-10 arbetartrådar och en lång kö av uppgifter än att skapa 100 trådar för en mängd uppgifter, som kommer att konkurrera med varandra om resurser: minne, processortid, databasåtkomst, etc."

"Här är ett exempel på ThreadPoolExecutor i aktion:"

Exempel
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, jag ser det inte..."

"Ett ThreadPoolExecutor- objekt skapas när metoden newFixedThreadPool anropas."

Så det är väldigt lätt att använda. Så snart du lägger till en uppgift till den med inlämningsmetoden, gör den:

A)  Väcker en sovande tråd, om det finns en, för att utföra uppgiften.

B)  Om det inte finns någon väntande tråd, skapas en ny för uppgiften.

C)  Om det maximala antalet trådar nås, så placerar det helt enkelt uppgiften i slutet av kön.

"Jag inkluderade medvetet «här laddar vi ner något stort från Internet» i exemplet. Om vi ​​har 100 uppgifter «ladda ner något stort från Internet», så är det ingen mening att köra många av dem samtidigt—vi' kommer att hållas tillbaka av bandbreddsgränsen för vår internetanslutning. I det här fallet borde ett par trådar räcka. Det här är vad du ser i exemplet ovan:"

ExecutorService service = Executors.newFixedThreadPool(2);

"Det visar sig att det inte är så svårt att arbeta med en massa uppgifter."

"Ja. Ännu lättare än du kanske tror. Men Kim kommer att berätta om det."