Når vi utvikler en flertrådsapplikasjon, må vi vanligvis håndtere å organisere arbeidet med tråder. Jo større applikasjonen vår og jo flere tråder vi trenger for flertrådede oppgaver, jo flereKjørbarobjekter vi lager.

Det skal bemerkes her at å lage en tråd i Java er en ganske dyr operasjon. Hvis vi oppretter en ny forekomst av tråden hver gang for å utføre en operasjon, vil vi få store problemer med ytelsen og, som et resultat, med helsen til applikasjonen.

En trådpool og ThreadPoolExecutor hjelper oss her.

En trådpool er et sett med forhåndsinitialiserte tråder. Størrelsen kan være fast eller variabel.

Hvis det er flere oppgaver enn tråder, venter oppgaver i en oppgavekø. Den N-te tråden i bassenget tar en oppgave fra køen, og etter at den er ferdig, plukker tråden opp en ny oppgave fra køen. Når alle oppgavene i køen er utført, forblir trådene aktive og venter på nye oppgaver. Når nye oppgaver dukker opp, begynner trådene å utføre dem også.

ThreadPoolExecutor

Fra og med Java 5 fikk Executor-rammeverket en multithreading-løsning. Generelt har den mange komponenter og formålet er å hjelpe oss med å effektivt administrere køer og trådpooler.

Hovedgrensesnittene er Executor og ExecutorService .

Executor er et grensesnitt med en enkelt void execute (Runnable runnable) metode.

Når du overfører en oppgave til en implementering av denne metoden, må du vite at den vil bli utført asynkront i fremtiden.

ExecutorService – Et grensesnitt som utvider Executor- grensesnittet, og legger til muligheter for å utføre oppgaver. Den har også metoder for å avbryte en kjørende oppgave og avslutte trådpoolen.

ThreadPoolExecutor implementerer Executor- og ExecutorService- grensesnittene og skiller oppgaveoppretting fra oppgavekjøring. Vi må implementere kjørbare objekter og sende dem til en eksekutør. ThreadPoolExecutorer da ansvarlig for å utføre oppgavene, og opprette og jobbe med tråder .

Etter at en oppgave er sendt til utførelse, brukes en eksisterende tråd i bassenget. Dette forbedrer ytelsen. Det løser problemet med å kaste bort ressurser på å opprette og initialisere en ny tråd, og så igjen på søppelinnsamling når vi er ferdige med tråden.

ThreadPoolExecutor har 4 konstruktører:


ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit, 
BlockingQueue<Runnable> workQueue)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory, 
RejectedExecutionHandler handler)
    

ThreadPoolExecutor - konstruktøren har følgende parametere:

corePoolSize Denne parameteren indikerer hvor mange tråder som vil være klare (startet) når executor-tjenesten starter.
maksimumPoolSize Maksimalt antall tråder som en eksekveringstjeneste kan opprette.
keepAliveTime Tiden som en frigjort tråd vil fortsette å leve før den blir ødelagt hvis antall tråder er større enncorePoolSize. Tidsenhetene angis i neste parameter.
enhet Tidsenheter (timer, minutter, sekunder, millisekunder osv.).
arbeidskø Implementering av kø for oppgaver.
handler Behandler for oppgaver som ikke kan gjennomføres.
threadFactory Et objekt som lager nye tråder etter behov. Bruk av trådfabrikker gjør anrop til en ny trådmaskinvareuavhengig, slik at applikasjoner kan bruke spesielle trådunderklasser, prioriteter og så videre.

Opprette en ThreadPoolExecutor

Executors - verktøyklassen kan forenkle opprettelsen av en ThreadPoolExecutor . Metodene i denne verktøyklassen hjelper oss med å forberede enThreadPoolExecutorgjenstand.

newFixedThreadPool — Oppretter en trådpool som gjenbruker et fast antall tråder for å utføre et hvilket som helst antall oppgaver.

ExecutorService executor = Executors.newFixedThreadPool(10);
                    
newWorkStealingPool — Oppretter en trådpool der antall tråder er lik antall prosessorkjerner tilgjengelig for JVM. Standard samtidighetsnivå er ett. Dette betyr at like mange tråder vil bli opprettet i bassenget som det er CPU-kjerner tilgjengelig for JVM. Hvis samtidighetsnivået er 4, brukes den beståtte verdien i stedet for antall kjerner.

ExecutorService executor = Executors.newWorkStealingPool(4);
                    
newSingleThreadExecutor — Oppretter et basseng med en enkelt tråd for å utføre alle oppgaver.

ExecutorService executor = Executors.newSingleThreadExecutor();
                    
newCachedThreadPool — Oppretter en trådpool som oppretter nye tråder etter behov, men gjenbruker tidligere opprettede tråder når de er tilgjengelige.

ExecutorService executor = Executors.newCachedThreadPool();
                    
newScheduledThreadPool — Oppretter en trådpool som kan planlegge kommandoer som skal utføres etter en gitt forsinkelse eller periodisk.

ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
                    

Vi vil vurdere hver type basseng i de følgende leksjonene.