Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Java

Java Multithreading onder de knie: Efficiënt gelijktijdig programmeren

Wat is multithreading?

Java is een multi-threaded programmeertaal, wat betekent dat je programma's kunt schrijven die meerdere taken gelijktijdig uitvoeren. Een thread is een lichte uitvoeringslijn binnen een proces. Door taken te verdelen over threads maak je optimaal gebruik van multicore-processors.

Levenscyclus van een thread

Een thread doorloopt de volgende stadia:

  • New (Nieuw) – De thread is aangemaakt maar nog niet gestart.
  • Runnable (Uitvoerbaar) – Na aanroep van start() is de thread klaar om te draaien.
  • Waiting (Wachtend) – De thread wacht op een signaal van een andere thread (bijv. wait(), join()).
  • Timed Waiting (Getimed wachtend) – Wacht voor een bepaalde tijd (sleep(), wait(timeout)).
  • Terminated (Beëindigd) – De run()-methode is voltooid of er is een onvangbare exception opgetreden.

Thread-prioriteiten

Elke thread heeft een prioriteit (1–10, standaard 5). Hogere prioriteit betekent meer kans op CPU-tijd, maar de JVM geeft geen garanties over uitvoervolgorde.

Een thread maken via Runnable

De aanbevolen manier: implementeer Runnable en geef het door aan een Thread-object.

Stappen

  1. Implementeer public void run() met je logica.
  2. Maak een Thread aan: new Thread(runnable, "naam").
  3. Roep start() aan (niet run() direct!).

Voorbeeld

class RunnableDemo implements Runnable {
    private Thread t;
    private String threadName;

    RunnableDemo(String name) {
        threadName = name;
        System.out.println("Aanmaken " + threadName);
    }

    public void run() {
        System.out.println("Draaien " + threadName);
        try {
            for (int i = 4; i > 0; i--) {
                System.out.println("Thread: " + threadName + ", " + i);
                Thread.sleep(50);
            }
        } catch (InterruptedException e) {
            System.out.println("Thread " + threadName + " onderbroken.");
        }
        System.out.println("Thread " + threadName + " stopt.");
    }

    public void start() {
        System.out.println("Starten " + threadName);
        if (t == null) {
            t = new Thread(this, threadName);
            t.start();
        }
    }
}

public class TestThread {
    public static void main(String[] args) {
        RunnableDemo R1 = new RunnableDemo("Thread-1");
        R1.start();
        RunnableDemo R2 = new RunnableDemo("Thread-2");
        R2.start();
    }
}

Een thread maken door Thread te extenten

Alternatief: maak een subklasse van Thread en overschrijf run(). Dit geeft meer controle maar beperkt overerving (Java ondersteunt geen multiple inheritance).

Voorbeeld

class ThreadDemo extends Thread {
    private String threadName;

    ThreadDemo(String name) {
        threadName = name;
        System.out.println("Aanmaken " + threadName);
    }

    public void run() {
        System.out.println("Draaien " + threadName);
        try {
            for (int i = 4; i > 0; i--) {
                System.out.println("Thread: " + threadName + ", " + i);
                Thread.sleep(50);
            }
        } catch (InterruptedException e) {
            System.out.println("Thread " + threadName + " onderbroken.");
        }
        System.out.println("Thread " + threadName + " stopt.");
    }
}

public class TestThread {
    public static void main(String[] args) {
        ThreadDemo T1 = new ThreadDemo("Thread-1");
        T1.start();
        ThreadDemo T2 = new ThreadDemo("Thread-2");
        T2.start();
    }
}

Belangrijke Thread-methoden

MethodeBeschrijving
start()Start de thread (roept run() aan in nieuwe thread)
run()Bevat de uit te voeren code
setName() / getName()Naam instellen/opvragen
setPriority(int)Prioriteit instellen (1–10)
setDaemon(boolean)Markeer als daemon-thread
join(long ms)Wacht tot thread klaar is of timeout
interrupt()Onderbreek een wachtende/slapende thread
isAlive()Controleer of thread nog draait

Statische methoden

MethodeBeschrijving
yield()Geef CPU vrij aan threads met gelijke prioriteit
sleep(long ms)Pauzeer huidige thread
holdsLock(Object)Check of huidige thread lock heeft
currentThread()Referentie naar huidige thread
dumpStack()Print stack trace (debuggen)

Belangrijke concepten voor gevorderden

  • Thread-synchronisatie (synchronized, locks)
  • Inter-thread communicatie (wait(), notify(), notifyAll())
  • Deadlock-voorkoming
  • Thread-pools en ExecutorService (moderne API)

Java

  1. C++ Multithreading beheersen: Efficiënt gelijktijdig programmeren
  2. Java-operators beheersen: typen, syntax en praktische voorbeelden
  3. Java-commentaar: typen, gebruik en best practices
  4. Java Enhanced For-lus beheersen: syntax, voorbeelden en best practices
  5. Java Strings beheersen: aanmaken, methodes en best practices
  6. Java interfaces meesteren: concepten, implementatie en best practices
  7. Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
  8. Java Try-with-resources meesteren: automatische resource management uitgelegd
  9. Java Annotaties uitgelegd: typen, plaatsing en praktische voorbeelden
  10. Java Assertions: een praktische gids voor bugdetectie en codebetrouwbaarheid
  11. Java Vector begrijpen: Gebruik, Kenmerken en Vergelijking met ArrayList