Multithreading inn Java
Enhver applikasjon kan ha flere prosesser (instanser). Hver av disse prosessene kan tilordnes enten som en enkelt trรฅd eller flere trรฅder. Vi vil se i denne opplรฆringen hvordan du utfรธrer flere oppgaver samtidig og ogsรฅ lรฆre mer om trรฅder og synkronisering mellom trรฅder.
Hva er enkelttrรฅd?
En enkelt trรฅd inn Java er i utgangspunktet en lett og den minste prosesseringsenheten. Java bruker trรฅder ved รฅ bruke en "Trรฅdklasse". Det finnes to typer trรฅd - brukertrรฅd og daemon-trรฅd (demontrรฅder brukes nรฅr vi รธnsker รฅ rense applikasjonen og brukes i bakgrunnen). Nรฅr en applikasjon fรธrst starter, opprettes brukertrรฅd. Post det, vi kan lage mange brukertrรฅder og daemontrรฅder.
Eksempel pรฅ รฉn trรฅd:
package demotest;
public class GuruThread
{
public static void main(String[] args) {
System.out.println("Single Thread");
}
}
Fordeler med enkel trรฅd:
- Reduserer overhead i applikasjonen som enkelttrรฅdskjรธring i systemet
- Dessuten reduserer det vedlikeholdskostnadene for applikasjonen.
Hva er Multithreading i Java?
multithreading in Java er en prosess for รฅ kjรธre to eller flere trรฅder samtidig for maksimal utnyttelse av CPU. Flertrรฅdede applikasjoner kjรธrer to eller flere trรฅder samtidig. Derfor er det ogsรฅ kjent som samtidighet i Java. Hver trรฅd gรฅr parallelt med hverandre. Flere trรฅder tildeler ikke separat minneomrรฅde, derfor sparer de minne. I tillegg tar kontekstveksling mellom trรฅder kortere tid.
Eksempel pรฅ multitrรฅd:
package demotest;
public class GuruThread1 implements Runnable
{
public static void main(String[] args) {
Thread guruThread1 = new Thread("Guru1");
Thread guruThread2 = new Thread("Guru2");
guruThread1.start();
guruThread2.start();
System.out.println("Thread names are following:");
System.out.println(guruThread1.getName());
System.out.println(guruThread2.getName());
}
@Override
public void run() {
}
}
Fordeler med multithread:
- Brukerne er ikke blokkert fordi trรฅdene er uavhengige, og vi kan utfรธre flere operasjoner til tider
- Som sรฅdan er trรฅdene uavhengige, de andre trรฅdene vil ikke bli pรฅvirket hvis en trรฅd mรธter et unntak.
Trรฅd livssyklus inn Java
Livssyklusen til en trรฅd:

Det er ulike stadier av livssyklusen til trรฅden som vist i diagrammet ovenfor:
- Ny
- Kjรธrbar
- kjรธrer
- venter
- Dรธd
- Nytt: I denne fasen opprettes trรฅden ved hjelp av klassen "Trรฅdklasse". Den forblir i denne tilstanden til programmet starter trรฅden. Det er ogsรฅ kjent som fรธdt trรฅd.
- Kjรธrbar: Pรฅ denne siden blir forekomsten av trรฅden pรฅkalt med en startmetode. Trรฅdkontrollen blir gitt til planleggeren for รฅ fullfรธre utfรธrelsen. Det avhenger av planleggeren om du skal kjรธre trรฅden.
- Lรธping: Nรฅr trรฅden begynner รฅ kjรธre, endres tilstanden til "kjรธrer". Planleggeren velger รฉn trรฅd fra trรฅdpoolen, og den begynner รฅ kjรธre i applikasjonen.
- Venter: Dette er tilstanden nรฅr en trรฅd mรฅ vente. Siden det kjรธrer flere trรฅder i applikasjonen, er det behov for synkronisering mellom trรฅder. Derfor mรฅ en trรฅd vente til den andre trรฅden blir utfรธrt. Derfor omtales denne tilstanden som ventetilstand.
- Dรธd: Dette er tilstanden nรฅr trรฅden avsluttes. Trรฅden er i lรธpende tilstand og sรฅ snart den er ferdig behandlet er den i "dรธd tilstand".
Metoder for multithreading Java
Noen av de vanligste metodene for trรฅder er:| Metode | Tekniske beskrivelser |
|---|---|
| start() | Denne metoden starter utfรธrelsen av trรฅden og JVM kaller run()-metoden pรฅ trรฅden. |
| Sรธvn (int millisekunder) | Denne metoden gjรธr at trรฅden hviler, og derfor vil trรฅdens kjรธring pause i millisekunder gitt, og etter det begynner trรฅden รฅ kjรธres igjen. Dette hjelper til med synkronisering av trรฅdene. |
| getName () | Det returnerer navnet pรฅ trรฅden. |
| setPriority(int newpriority) | Det endrer prioritet til trรฅden. |
| avkastning () | Det fรธrer til at gjeldende trรฅd stopper og andre trรฅder kjรธres. |
Eksempel: I dette multithreading-programmet i Java for eksempel skal vi lage en trรฅd og utforske innebygde metoder som er tilgjengelige for trรฅder.
package demotest;
public class thread_example1 implements Runnable {
@Override
public void run() {
}
public static void main(String[] args) {
Thread guruthread1 = new Thread();
guruthread1.start();
try {
guruthread1.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
guruthread1.setPriority(1);
int gurupriority = guruthread1.getPriority();
System.out.println(gurupriority);
System.out.println("Thread Running");
}
}
Forklaring av koden:
- Kodelinje 2: Vi oppretter en klasse "thread_Example1" som implementerer Runnable-grensesnittet (det bรธr implementeres av enhver klasse hvis instanser er ment รฅ kjรธres av trรฅden.)
- Kodelinje 4: Den overstyrer kjรธremetoden til det kjรธrbare grensesnittet, da det er obligatorisk รฅ overstyre den metoden
- Kodelinje 6: Her har vi definert hovedmetoden der vi skal starte utfรธrelsen av trรฅden.
- Kodelinje 7: Her lager vi et nytt trรฅdnavn som "guruthread1" ved รฅ instansiere en ny trรฅdklasse.
- Kodelinje 8: vi vil bruke "start"-metoden for trรฅden ved รฅ bruke "guruthread1"-forekomst. Her vil trรฅden begynne รฅ kjรธre.
- Kodelinje 10: Her bruker vi "sleep"-metoden til trรฅden ved รฅ bruke "guruthread1"-forekomst. Derfor vil trรฅden sove i 1000 millisekunder.
- Kode 9-14: Her har vi satt sleep-metoden i try catch-blokken da det er krysset av unntak som oppstรฅr dvs. Avbrutt unntak.
- Kodelinje 15: Her setter vi trรฅdens prioritet til 1 fra hvilken prioritet den var
- Kodelinje 16: Her fรฅr vi prioritet til trรฅden ved รฅ bruke getPriority()
- Kodelinje 17: Her skriver vi ut verdien hentet fra getPriority
- Kodelinje 18: Her skriver vi en tekst som trรฅden kjรธrer.
Nรฅr du kjรธrer koden ovenfor, fรฅr du fรธlgende utgang:
Utgang:
5 er trรฅdprioritet, og trรฅd som kjรธrer er teksten som er utdata fra koden vรฅr.
Java Trรฅd Synchronisering
I multithreading er det den asynkrone oppfรธrselen til programmene. Hvis en trรฅd skriver noen data og en annen trรฅd som leser data samtidig, kan det skape inkonsekvens i applikasjonen. Nรฅr det er behov for รฅ fรฅ tilgang til de delte ressursene med to eller flere trรฅder, brukes synkroniseringstilnรฆrming. Java har gitt synkroniserte metoder for รฅ implementere synkronisert atferd.
I denne tilnรฆrmingen, nรฅr trรฅden nรฅr inn i den synkroniserte blokken, kan ingen annen trรฅd kalle den metoden pรฅ det samme objektet. Alle trรฅder mรฅ vente til den trรฅden fullfรธrer den synkroniserte blokken og kommer ut av den. Pรฅ denne mรฅten hjelper synkroniseringen i en flertrรฅdsapplikasjon. En trรฅd mรฅ vente til den andre trรฅden er ferdig med utfรธringen, bare da er de andre trรฅdene tillatt for utfรธrelse.
Det kan skrives i fรธlgende form:
Synchronized(object)
{
//Block of statements to be synchronized
}
Multithreading inn Java Eksempler pรฅ programmer
I denne multithreading Java for eksempel tar vi to trรฅder og henter navnene pรฅ trรฅden.
Example1:
GuruThread1.java
package demotest;
public class GuruThread1 implements Runnable{
/**
* @param args
*/
public static void main(String[] args) {
Thread guruThread1 = new Thread("Guru1");
Thread guruThread2 = new Thread("Guru2");
guruThread1.start();
guruThread2.start();
System.out.println("Thread names are following:");
System.out.println(guruThread1.getName());
System.out.println(guruThread2.getName());
}
@Override
public void run() {
}
}
Forklaring av koden:
- Kodelinje 3: Vi har tatt en klasse "GuruThread1" som implementerer Runnable (den bรธr implementeres av enhver klasse hvis forekomster er ment รฅ bli utfรธrt av trรฅden.)
- Kodelinje 8: Dette er hovedmetoden i klassen
- Kodelinje 9: Her instansierer vi Thread-klassen og lager en forekomst kalt "guruThread1" og lager en trรฅd.
- Kodelinje 10: Her instansierer vi Thread-klassen og lager en forekomst kalt "guruThread2" og lager en trรฅd.
- Kodelinje 11: Vi starter trรฅden dvs. guruThread1.
- Kodelinje 12: Vi starter trรฅden dvs. guruThread2.
- Kodelinje 13: Skrive ut teksten som "Trรฅdnavn fรธlger:"
- Kodelinje 14: Hente navnet pรฅ trรฅd 1 ved รฅ bruke metoden getName() til trรฅdklassen.
- Kodelinje 15: Hente navnet pรฅ trรฅd 2 ved รฅ bruke metoden getName() til trรฅdklassen.
Nรฅr du kjรธrer koden ovenfor, fรฅr du fรธlgende utgang:
Utgang:
Trรฅdnavn sendes ut her som
- Guru1
- Guru2
Eksempel 2:
I denne multithreading i Java for eksempel vil vi lรฆre om รฅ overstyre metodene run() og start() for et kjรธrbart grensesnitt og lage to trรฅder av den klassen og kjรธre dem deretter.
Dessuten tar vi to klasser,
- En som vil implementere det kjรธrbare grensesnittet og
- En annen som vil ha hovedmetoden og utfรธre deretter.
package demotest;
public class GuruThread2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
GuruThread3 threadguru1 = new GuruThread3("guru1");
threadguru1.start();
GuruThread3 threadguru2 = new GuruThread3("guru2");
threadguru2.start();
}
}
class GuruThread3 implements Runnable {
Thread guruthread;
private String guruname;
GuruThread3(String name) {
guruname = name;
}
@Override
public void run() {
System.out.println("Thread running" + guruname);
for (int i = 0; i < 4; i++) {
System.out.println(i);
System.out.println(guruname);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Thread has been interrupted");
}
}
}
public void start() {
System.out.println("Thread started");
if (guruthread == null) {
guruthread = new Thread(this, guruname);
guruthread.start();
}
}
}
Forklaring av koden:
- Kodelinje 2: Her tar vi en klasse "GuruThread2" som vil ha hovedmetoden i seg.
- Kodelinje 4: Her tar vi en hovedmetode for klassen.
- Kodelinje 6-7: Her lager vi en forekomst av klassen GuruThread3 (som er opprettet pรฅ linjene under i koden) som "threadguru1", og vi starter trรฅden.
- Kodelinje 8-9: Her lager vi en annen forekomst av klassen GuruThread3 (som er opprettet pรฅ linjene under i koden) som "threadguru2", og vi starter trรฅden.
- Kodelinje 11: Her lager vi en klasse "GuruThread3" som implementerer det kjรธrbare grensesnittet (det bรธr implementeres av enhver klasse hvis forekomster er ment รฅ bli utfรธrt av trรฅden.)
- Kodelinje 13-14: vi tar to klassevariabler hvorfra den ene er av typen trรฅdklasse og den andre av strengklassen.
- Kodelinje 15-18: vi overstyrer GuruThread3-konstruktรธren, som tar ett argument som strengtype (som er trรฅdens navn) som blir tilordnet klassevariabelen guruname og derfor lagres navnet pรฅ trรฅden.
- Kodelinje 20: Her overstyrer vi run()-metoden til det kjรธrbare grensesnittet.
- Kodelinje 21: Vi skriver ut trรฅdnavnet ved รฅ bruke println-setningen.
- Kodelinje 22-31: Her bruker vi en for-lรธkke med telleren initialisert til 0, og den skal ikke vรฆre mindre enn 4 (vi kan ta et hvilket som helst tall, derfor vil lรธkken kjรธre 4 ganger) og รธke telleren. Vi skriver ut trรฅdnavnet og gjรธr ogsรฅ at trรฅden hviler i 1000 millisekunder innenfor en prรธvefangst-blokk, da sรธvnmetoden hevet sjekket unntak.
- Kodelinje 33: Her overstyrer vi startmetoden til det kjรธrbare grensesnittet.
- Kodelinje 35: Vi sender ut teksten "Trรฅd startet".
- Kodelinje 36-40: Her tar vi en if-betingelse for รฅ sjekke om klassevariabelen guruthread har verdi i seg eller ikke. Hvis den er null, lager vi en forekomst ved รฅ bruke trรฅdklassen som tar navnet som en parameter (verdien som ble tildelt i konstruktรธren). Deretter startes trรฅden ved hjelp av start()-metoden.
Nรฅr du kjรธrer koden ovenfor fรฅr du fรธlgende utgang:
Produksjon:
Det er to trรฅder, derfor fรฅr vi to ganger meldingen "Trรฅd startet".
Vi fรฅr navnene pรฅ trรฅden slik vi har skrevet dem ut.
Det gรฅr inn i for loop der vi skriver ut telleren og trรฅdnavnet og telleren starter med 0.
Slรธyfen kjรธres tre ganger og i mellom sover trรฅden i 1000 millisekunder.
Derfor fรฅr vi fรธrst guru1 sรฅ guru2 sรฅ igjen guru2 fordi trรฅden sover her i 1000 millisekunder og deretter neste guru1 og igjen guru1, trรฅd sover i 1000 millisekunder, sรฅ vi fรฅr guru2 og sรฅ guru1.
Sammendrag
I denne opplรฆringen sรฅ vi flertrรฅdede applikasjoner i Java og hvordan du bruker enkelt og flertrรฅd i Java.
- Forklar multithreading Java: i multithreading blokkeres ikke brukere da trรฅder er uavhengige og kan utfรธre flere operasjoner samtidig
- Ulike stadier av livssyklusen til trรฅden er,
- Ny
- Kjรธrbar
- kjรธrer
- venter
- Dรธd
- Vi lรฆrte ogsรฅ om synkronisering mellom trรฅder, som hjelper applikasjonen til รฅ kjรธre jevnt.
- Flertrรฅdsprogrammering inn Java gjรธr mange flere applikasjonsoppgaver enklere.



