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:
- Code Linje 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.)
- Code Linje 4: Den overstyrer kjรธremetoden til det kjรธrbare grensesnittet, da det er obligatorisk รฅ overstyre den metoden
- Code Linje 6: Her har vi definert hovedmetoden der vi skal starte utfรธrelsen av trรฅden.
- Code Linje 7: Her lager vi et nytt trรฅdnavn som "guruthread1" ved รฅ instansiere en ny trรฅdklasse.
- Code Linje 8: vi vil bruke "start"-metoden for trรฅden ved รฅ bruke "guruthread1"-forekomst. Her vil trรฅden begynne รฅ kjรธre.
- Code Linje 10: Her bruker vi "sleep"-metoden til trรฅden ved รฅ bruke "guruthread1"-forekomst. Derfor vil trรฅden sove i 1000 millisekunder.
- Code 9-14: Her har vi satt sleep-metoden i try catch-blokken da det er krysset av unntak som oppstรฅr dvs. Avbrutt unntak.
- Code Linje 15: Her setter vi trรฅdens prioritet til 1 fra hvilken prioritet den var
- Code Linje 16: Her fรฅr vi prioritet til trรฅden ved รฅ bruke getPriority()
- Code Linje 17: Her skriver vi ut verdien hentet fra getPriority
- Code Linje 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:
- Code Linje 3: Vi har tatt et kurs ยซGuruยซTrรฅd1ยป som implementerer Runnable (den bรธr implementeres av enhver klasse hvis instanser er ment รฅ bli utfรธrt av trรฅden.)
- Code Linje 8: Dette er hovedmetoden i klassen
- Code Linje 9: Her instansierer vi Thread-klassen og lager en forekomst kalt "guruThread1" og lager en trรฅd.
- Code Linje 10: Her instansierer vi Thread-klassen og lager en forekomst kalt "guruThread2" og lager en trรฅd.
- Code Linje 11: Vi starter trรฅden dvs. guruThread1.
- Code Linje 12: Vi starter trรฅden dvs. guruThread2.
- Code Linje 13: Skrive ut teksten som "Trรฅdnavn fรธlger:"
- Code Linje 14: Hente navnet pรฅ trรฅd 1 ved รฅ bruke metoden getName() til trรฅdklassen.
- Code Linje 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:
- Code Linje 2: Her tar vi et kurs"GuruTrรฅd2ยป som vil ha hovedmetoden i seg.
- Code Linje 4: Her tar vi en hovedmetode for klassen.
- Code Linje 6-7: Her lager vi en instans av klassen GuruTrรฅd3 (som er opprettet i kodelinjene nedenfor) som ยซthreadguru1ยป, og vi starter trรฅden.
- Code Linje 8-9: Her lager vi en ny instans av klassen GuruTrรฅd3 (som er opprettet i kodelinjene nedenfor) som ยซthreadguru2ยป, og vi starter trรฅden.
- Code Linje 11: Her lager vi en klasse ยซGuruThread3ยป som implementerer det kjรธrbare grensesnittet (det bรธr implementeres av enhver klasse hvis instanser er ment รฅ bli utfรธrt av trรฅden.)
- Code Linje 13-14: vi tar to klassevariabler hvorfra den ene er av typen trรฅdklasse og den andre av strengklassen.
- Code Linje 15-18: vi overstyrer GuruTrรฅd3-konstruktรธren, som tar ett argument som strengtype (som er trรฅdnavnet) som blir tilordnet klassevariabelen guruname, og dermed lagres navnet pรฅ trรฅden.
- Code Linje 20: Her overstyrer vi run()-metoden til det kjรธrbare grensesnittet.
- Code Linje 21: Vi skriver ut trรฅdnavnet ved รฅ bruke println-setningen.
- Code Linje 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.
- Code Linje 33: Her overstyrer vi startmetoden til det kjรธrbare grensesnittet.
- Code Linje 35: Vi sender ut teksten "Trรฅd startet".
- Code Linje 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.



