multithreading java tutorial with examples
Deze tutorial legt alles uit over multithreading in Java, gelijktijdigheidsimplementatie, de levenscyclus van een thread, Thread Class-voorbeeld, Thread met behulp van Runnable-interface:
De gelijktijdigheid in de computerwereld is het vermogen van een systeem (of het nu een applicatie, computer of programmeertaal is) om verschillende instanties van een programma of applicatie parallel uit te voeren.
Door instances of programma's gelijktijdig uit te voeren, zorgen we voor een hoge doorvoer en hogere prestaties omdat we de onbenutte bronnen zoals hardware van het besturingssysteem enz. Kunnen gebruiken. Bijvoorbeeld, als een systeem meerdere CPU's heeft, kan de applicatie deze CPU's effectief gebruiken en de doorvoer verhogen.
Bezoek hier voor de exclusieve Java Training Tutorial Series.
Wat je leert:
- Wat is multithreading in Java
- Wat is een thread in Java
- Gevolgtrekking
Wat is multithreading in Java
In Java kunnen threads worden gezien als de ruggengraat van concurrency. Een thread is een uitvoerbare, lichtgewicht eenheid die toegang heeft tot gedeelde bronnen en tot zijn eigen call-stack.
Een Java-applicatie is één proces en binnen deze applicatie kunnen we meerdere threads hebben om gelijktijdigheid te bereiken.
We weten dat een applicatie die op het systeem draait, meerdere instances kan hebben en deze worden meestal multi-doc applicaties genoemd. Deze toepassingsinstanties worden processen genoemd. Elk van deze processen krijgt een uitvoeringseenheid toegewezen die bekend staat als een thread.
Afhankelijk van het besturingssysteem en de toepassingsvereisten, kan het proces worden toegewezen aan een enkele thread of meerdere threads. Als het aanvraagproces aan meerdere threads is toegewezen, moeten we deze meerdere threads tegelijkertijd uitvoeren.
Deze techniek van het gelijktijdig of gelijktijdig uitvoeren of uitvoeren van meerdere threads staat bekend als multithreading
Multithreading betekent simpelweg dat we meer dan één thread hebben die binnen dezelfde applicatie wordt uitgevoerd.
De programmeertaal Java heeft ingebouwde ondersteuning voor multithreading.
Multithreading wordt weergegeven in het bovenstaande diagram. Zoals getoond, zijn er meerdere threads die gelijktijdig binnen een applicatie worden uitgevoerd.
Bijvoorbeeld, een desktoptoepassing die functies biedt zoals bewerken, afdrukken, enz. is een multithread-applicatie. Omdat afdrukken in deze toepassing een achtergrondproces is, kunnen we documenten bewerken en tegelijkertijd documenten afdrukken door deze functies aan twee verschillende threads toe te wijzen.
De threads in multithread-applicaties lopen parallel aan elkaar op een gelijktijdige manier. Multithreading is dus ook een onderdeel van concurrency in Java. Merk op dat hoewel er meerdere threads zijn, ze het geheugengebied delen en zo geheugen besparen. Ook kunnen threads gemakkelijk in een mum van tijd van context wisselen.
Multithreading is vooral handig omdat het de gelijktijdige uitvoering van twee of meer delen van een applicatie mogelijk maakt. Hierdoor kan de applicatie de CPU-tijd maximaal benutten en wordt de inactieve tijd tot een minimum beperkt.
Hieronder volgen enkele van de termen die we moeten kennen met betrekking tot de multithreading-omgeving, aangezien deze vaak worden gebruikt.
Multitasking: Bij multitasking worden meerdere taken tegelijk uitgevoerd.
Multithreading: Multithreading, zoals eerder vermeld, is een proces waarbij meerdere threads tegelijkertijd worden uitgevoerd.
hoe open ik swf-bestanden
Multiprocessing: Bij multiprocessing wordt meer dan één proces tegelijkertijd uitgevoerd. Vergelijkbaar met multitasking, maar hier is meer dan één CPU bij betrokken.
Parallelle verwerking: Parallelle verwerking is een techniek waarbij meerdere CPU's tegelijkertijd in een computersysteem werken.
Nadat we multithreading hebben besproken, rijst de vraag waarom we überhaupt multithreading nodig hebben?
Voordelen van multithreading
Multithreading heeft verschillende voordelen die helpen bij het efficiënt programmeren.
De onderstaande punten zullen het duidelijk maken.
# 1) Efficiënt gebruik van systemen met één CPU
Als er maar één CPU in het systeem is, met een enkele thread, wordt de CPU-tijd verspild. Wanneer de thread bezig is met het gebruik van andere bronnen, zoals IO, is de CPU niet actief. We kunnen dit verbeteren en de CPU beter benutten door multithreaded applicaties te hebben.
Door multithreading te gebruiken, als een thread wordt gedaan met CPU, kan de andere thread deze gebruiken. Met meerdere threads zal de inactiviteit van de CPU aanzienlijk worden verminderd.
# 2) Efficiënt gebruik van meerdere CPU-systemen
Net als enkele CPU's, zelfs met systemen met meerdere CPU's, kunnen de multithreaded applicaties meerdere CPU's efficiënt gebruiken.
# 3) Verbeterde gebruikerservaring met betrekking tot reactievermogen en eerlijkheid
Het reactievermogen van het systeem verbetert met multithreaded applicaties. We ervaren de ‘GUI hangt’ wanneer we meerdere threads hebben die verschillende taken in de applicatie uitvoeren en de gebruikers niet lang hoeven te wachten om een antwoord op hun verzoeken te krijgen.
Evenzo zijn de gebruikers op de juiste manier services in multithread-systemen.
Hoe concurrency in Java te implementeren
De eerste klasse waarmee we concurrency in Java kunnen implementeren is java.lang.Thread klasse. Deze Thread-klasse vormt de basis van concurrency in Java.
We hebben ook java.lang.Runnable interface die kan worden geïmplementeerd door een Java-klasse om het threadgedrag te abstraheren. Voor geavanceerde applicatieontwikkeling kunnen we gebruik maken van de java.util.concurrent pakket beschikbaar sinds Java 1.5.
In de toekomst zullen we concurrency in Java in detail bespreken. Laten we in deze zelfstudie het concept van threads in Java bespreken en begrijpen. In onze volgende tutorials over multithreading zullen we verschillende concepten voor multithreading en concurrency onderzoeken.
Wat is een thread in Java
Een enkele draad kan worden gedefinieerd als de kleinste en lichtgewicht verwerkingseenheid. In Java worden threads gebruikt in programma's die de klasse ‘Thread’ gebruiken.
Er zijn twee soorten Java-threads:
# 1) Gebruikersdraad: gebruikersthread wordt gemaakt wanneer de applicatie voor het eerst start. Dan kunnen we zoveel gebruikers- en daemon-thread maken.
# 2) Daemon-thread: daemon-threads worden voornamelijk op de achtergrond gebruikt en worden gebruikt voor taken zoals het opschonen van de applicatie, enz.
Threads verlagen de onderhoudskosten van de applicatie. Het vermindert ook de applicatie-overhead.
Een voorbeeld van een enkele thread wordt hieronder getoond:
Het bovenstaande programma geeft 'Dit is een thread' weer, want wanneer de toepassing start, wordt er een gebruikersthread gemaakt. In het bovenstaande programma is de hoofdfunctie het startpunt van de applicatie en het creëert een gebruikersthread.
De levenscyclus van een draad
Het volgende diagram toont de levenscyclus van een thread in Java.
Zoals te zien is in het bovenstaande diagram, heeft een thread in Java de volgende statussen:
# 1) Nieuw: Aanvankelijk heeft de thread die zojuist is gemaakt vanuit de threadklasse een ‘nieuwe’ status. Het moet nog worden begonnen. Deze thread wordt ook wel ‘Geboren draad’
# 2) Runnable: In deze toestand wordt de instantie van een thread aangeroepen met behulp van de methode 'begin'
# 3) Hardlopen: De startmethode van de threadinstantie wordt aangeroepen en de thread begint met de uitvoering. Dit is de lopende staat. Meestal plant en beheert de planner de threads.
# 4) Geblokkeerd: Er zijn meerdere threads in een applicatie. Deze threads moeten wachten op een andere omdat hun uitvoering moet worden gesynchroniseerd.
# 5) Beëindigd: Zodra het uitvoeringsproces van de thread voorbij is, wordt de thread beëindigd of wordt de uitvoering ervan gestopt.
Er wordt dus eerst een thread gemaakt, vervolgens gepland en later voert de planner de thread uit. Terwijl de lopende draad kan worden geblokkeerd of opgeschort voor een andere activiteit. Daarna wordt het hervat en terwijl de verwerking is voltooid, wordt de thread uitgevoerd.
Thread Prioriteiten
Een threadprioriteit bepaalt hoe de ene thread moet worden behandeld ten opzichte van de andere threads in een applicatie. Een threadprioriteit is een geheel getal.
Hieronder staan enkele punten die u moet onthouden over threadprioriteiten:
- Thread-prioriteiten zijn gehele getallen.
- Met behulp van threadprioriteit kunnen we beslissen wanneer we moeten overschakelen van de ene thread in actieve toestand naar de andere. Dit is het contextomschakelingsproces waarin we de contexten van de threads wisselen.
- Elke keer dat een thread vrijwillig zijn controle over de CPU kan loslaten. Dan kan de draad met de hoogste prioriteit het overnemen.
- Evenzo kan een thread met een hogere prioriteit voorrang krijgen op elke andere thread met een lagere prioriteit.
- Thread-klasse biedt een setPriority () - methode die wordt gebruikt om de prioriteit voor de thread in te stellen.
- We kunnen ook constanten MIN_PRIORITY, MAX_PRIORITY of NORM_PRIORITY gebruiken in plaats van gehele getallen.
Maak een discussielijn
We kunnen een thread maken op een van de volgende manieren:
- Uitbreiding van de Java-klasse ‘Thread’.
- Implementeren van ‘Runnable’.
Uitbreiding van de Java ‘Thread’ Class
De klasse ‘Thread’ bevat de constructors en methoden waarmee we bewerkingen op een thread-object kunnen maken en uitvoeren. Intern implementeert de Thread-klasse de Runnable-interface en breidt deze ook de Object-klasse uit.
De volgende tabel geeft een overzicht van verschillende constructors en methoden van een Thread () - klasse.
Bouwer/ | Voorlopig ontwerp | Omschrijving |
---|---|---|
slaap | openbare leegte slaap (lange milliseconden) | De uitvoering van de huidige thread wordt gedurende gespecificeerde milliseconden gestopt. |
Thread () constructor | Draad() | Standaardconstructor om een Thread-object te maken. |
Thread (String naam) | Constructor om een Thread-object met een opgegeven naam te maken. | |
Draad (Runnable r) | Maak een Thread-instantie met het opgegeven Runnable-interfaceobject. | |
Thread (Runnable r, String name) | Maak een Thread-instantie met het opgegeven Runnable-interfaceobject en de opgegeven naam | |
rennen | openbare ongeldige run () | De methode Run voert de actie uit voor een thread. Roept de thread aan. |
begin | public void start () | Wordt gebruikt om de uitvoering van de thread te starten. Intern roept de JVM de methode run () op deze thread aan. |
toetreden | openbare ongeldige deelname () | Wacht tot de draad dood is |
public void join (lange milliseconden) | Wacht gespecificeerde milliseconden totdat de draad dood is. | |
getPriority | openbare int getPriority () | Geef de threadprioriteit terug |
setPriority | public int setPriority(int priority) | Wijzig de threadprioriteit in een opgegeven prioriteit |
getName | openbare String getName () | geef de naam van de thread terug. |
setName | public void setName (String naam) | Stel de naam van de thread in op de opgegeven string |
currentThread | openbare Thread currentThread () | Retourneert de referentie van de thread die momenteel actief is |
getId | openbare int getId () | Retourthread-ID |
getState () | openbare Thread.State getState () | Retourneert de huidige status van de thread |
is levend | openbare boolean isAlive () | Controleer of de thread leeft en retourneer true indien ja. |
opbrengst | openbare leegte opbrengst () | Pauzeert tijdelijk de huidige thread en staat andere threads toe om uit te voeren. |
isDaemon | openbare boolean isDaemon () | Controleer of de thread een daemon-thread is; retourneer waar als ja. |
setDaemon | openbare ongeldige setDaemon (boolean b) | Stel de thread in als een daemon-thread als b = true; anders ingesteld als gebruikersthread. |
onderbreken | openbare ongeldige onderbreking () | Onderbreek de huidige thread. |
is onderbroken | openbare boolean isInterrupted () | Controleer of de draad is onderbroken. |
onderbroken | openbare statische boolean onderbroken () | Controleer of de huidige thread is onderbroken. |
dumpStack | Statische leegte dumpStack () | Drukt een stapeltracering van de huidige thread af naar de standaardfoutstroom. |
opschorten | openbare leegte opschorten () | Schort alle discussies op. (** methode is verouderd in de nieuwste Java-versies) |
hervat | openbaar leegte hervatten () | Hervat hangende draad. (** methode is verouderd in de nieuwste Java-versies) |
hou op | openbare leegte stop () | Stopt de draad. (** methode is verouderd in de nieuwste Java-versies) |
We zullen deze thread-methoden uitdiepen in onze volgende tutorial over multithreading.
Een thread beginnen
De methode start () die wordt gebruikt om de thread te starten, voert de volgende stappen uit:
- Start een nieuwe threadinstantie met een nieuwe CallStack.
- De threadstatus is gewijzigd van nieuw in uitvoerbaar.
- Als de thread aan de beurt is, wordt de methode run () uitgevoerd.
Implementatie van de ‘Runnable’ interface
Een threadinstantie kan ook worden gemaakt met behulp van de Runnable-interface. Om een threadinstantie te maken, moet de klasse waarvan de objecten door een thread moeten worden uitgevoerd, de Runnable-interface implementeren.
De Runnable-interface heeft maar één methode:
Thread Class Voorbeeld
Laten we nu de thread in Java demonstreren met de thread-klasse.
Uitvoer
Java-thread met behulp van een uitvoerbare interface
Het volgende voorbeeld toont het gebruik van de Runnable-interface om een threadinstantie te maken.
Uitvoer
Hoe een discussie in Java te stoppen
We hebben de draadvoorbeelden hierboven gezien. Uit deze voorbeelden weten we dat wanneer de run-methode de uitvoering heeft voltooid, de thread stopt of ook stopt vanwege enkele uitzonderingen.
Eerdere versies van Java hadden een stop () - methode in de Thread-klasse die kon worden gebruikt om de thread direct te stoppen. Maar het is nu om veiligheidsredenen verouderd. We moeten dus de andere methoden gebruiken om de thread die wordt uitgevoerd te stoppen.
Er zijn twee methoden die we kunnen gebruiken om de draad te stoppen.
- Met behulp van een vluchtige booleaanse variabele
- Interrupts gebruiken.
In deze sectie bespreken we beide methoden om een thread te stoppen.
Met behulp van een vluchtige Booleaanse variabele
Bij deze methode onderhouden we een booleaanse variabele say flag, om de thread te stoppen. De thread loopt zolang de booleaanse variabele is ingesteld op true. Op het moment dat het vals wordt, wordt de thread gestopt.
De specialiteit van deze methode is dat we de booleaanse variabele declareren als ' vluchtig ”Zodat het altijd uit het hoofdgeheugen wordt gelezen en het programma het niet in de CPU-cache kan cachen. Op deze manier is er geen verschil in de waarden die zijn ingesteld en gelezen.
De implementatie van het stoppen van een thread met behulp van een vluchtige booleaanse variabele wordt hieronder weergegeven.
Uitvoer
Notitie: Hier hebben we slechts een deel van de output getoond. De draad kan enkele minuten lopen voordat hij stopt. Zodat we verschillende output op verschillende systemen kunnen verkrijgen.
Interrupts gebruiken
Hier wordt de thread gestopt met behulp van de interrupt () - methode zoals we hierboven al hebben besproken in de thread class-methoden. De methode interrupt () stelt de status van de thread in als onderbroken. Deze status wordt doorgegeven aan de while-lus van de methode run (). We kunnen de onderbroken status verkrijgen met behulp van de interrupted () - methode.
Het volgende programma demonstreert het gebruik van de methode interrupt () om de thread te stoppen.
Uitvoer
Veel Gestelde Vragen
V # 1) Waarom gebruiken we multithreading in Java?
Antwoord: Multithreading maakt gelijktijdige of gelijktijdige uitvoering van twee of meer threads in een applicatie mogelijk. De gelijktijdige uitvoering maximaliseert de doorvoer en maakt ook maximaal gebruik van de CPU.
Vraag 2) Wat is multithreading? Welke soorten zijn er?
Antwoord: Multithreading betekent het uitvoeren van meer dan één thread. Deze uitvoering kan gelijktijdig of parallel zijn. Multithreading heeft dus twee typen, namelijk gelijktijdig of parallel.
c ++ bestandsinvoer uitvoer
V # 3) Wat is multithreading versus multiprocessing?
Antwoord: Bij multithreading zijn er meerdere threads voor dezelfde of verschillende processen en deze threads worden gelijktijdig uitgevoerd om de rekensnelheid van een systeem te verhogen. Bij multiprocessing heeft een systeem meer dan twee CPU's en worden meerdere processen tegelijkertijd uitgevoerd.
V # 4) Wat zijn de voordelen van multithreading in Java?
Antwoord: Met multithreading kunnen we verschillende delen van een applicatie gelijktijdig met threads uitvoeren. Multithreading verhoogt de doorvoer van het systeem. Multithreading maximaliseert ook het CPU-gebruik, aangezien verschillende threads continu de CPU gebruiken.
V # 5) Is multithreading goed voor gamen?
Antwoord: Ja, vooral voor moderne games.
Gevolgtrekking
Dit gaat allemaal over de introductie van multithreading. We hebben in deze tutorial de concurrency en multi-threading in Java besproken. We bespraken het maken van een thread met de Thread-klasse en de Runnable-interface en hebben de juiste voorbeelden gegeven.
We hebben ook de concepten van een enkele thread en de creatie ervan in detail geleerd. De draadconcepten inclusief de levenscyclus van een draad, het stoppen van een draad, soorten draad, etc. zijn in deze tutorial besproken.
We hebben ook uitgebreid gesproken over multithreading en gelijktijdigheid in Java. Aan het einde van deze tutorial zou de lezer de concepten concurrency en multithreading en ook threads in Java gemakkelijk moeten kunnen begrijpen.
Bekijk hier de eenvoudige Java-trainingsserie.
Aanbevolen literatuur
- Multithreading in C ++ met voorbeelden
- Java-threads met methoden en levenscyclus
- Thread.Sleep () - Thread Sleep () -methode in Java met voorbeelden
- JAVA-zelfstudie voor beginners: 100+ praktische Java-videotutorials
- Zelfstudie over reflectie in Java met voorbeelden
- Java String bevat () Method Tutorial met voorbeelden
- Jagged Array in Java - Tutorial met voorbeelden
- Zelfstudie voor Java-scannerklassen met voorbeelden