kramann.info
© Guido Kramann

Login: Passwort:










2.1 Parallelisierung von Prozessen mit Java

  • Im Kapitel "Threads" unterhalb des Hauptmenüpunktes "Java" finden Sie eine Übersicht über die Steuerbefehle, die von der Klasse Thread in Java bereitgestellt werden.
  • Im folgenden sollen einige Beispiele aufgezeigt werden, wie Threads in Java-Programmen erzeugt werden können.
  • Die Beispiele stehen ebenso unter Java/Threads zum Download zur Verfügung.

Verzweigung - thread001

  • Zwei Prozesse mA und mB werden erzeugt und parallel ausgeführt.
Verzweigung als Prozessfluss-Graph

Bild 2.1-1: Verzweigung als Prozessfluss-Graph

public class MeinThread extends Thread
{
    MeinThread(String name)
    {
        setName(name);
    }
    public void run()
    {
        while(true)
        {
            System.out.print(" "+getName());
            try
            {
                Thread.sleep(50);
            }
            catch(Exception e)
            {
            }
        }
    }
}

Code 2.1-1: MeinThread.java - Von Klasse Thread erbende Java-Klasse "MeinThread"

public class Hauptprogramm
{
    public static void pausieren()
    {
        try
        {
            Thread.sleep(5000);
        }
        catch(Exception e)
        {
        }
    }
    public static void main(String[] args)
    {
        MeinThread mA = new MeinThread("A");
        MeinThread mB = new MeinThread("B");
        System.out.println("\nThread A starten: mA.start();\n");
        mA.start();
        pausieren();
        System.out.println("\nThread B starten: mB.start();\n");
        mB.start();
        pausieren();
        System.out.println("\nThread A anhalten: mA.suspend();\n");
        mA.suspend();
        pausieren();
        System.out.println("\nThread A weiterfuehren: mA.resume();\n");
        mA.resume();
        pausieren();
        System.out.println("\nThread A und B anhalten: mA.stop();mB.stop();\n");
        mA.stop();
        mB.stop();
    }
}

Code 2.1-2: Hauptprogramm - Java-Programm, das zwei Thread-Objekte vom Typ "MeinThread" erzeugt und deren Methode "run" startet.

Thread A starten: mA.start();
 A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A 
 A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A 
 A A A A A A A A A A A A A A
Thread B starten: mB.start();
 B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B 
 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B 
 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B 
 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B 
 A B A B A B A B A B A B A B A B A B A B A B A B A
Thread A anhalten: mA.suspend();
 B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B 
 B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B 
 B B B B B B B B B B B B B B
Thread A weiterfuehren: mA.resume();
 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A 
 B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B 
 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A 
 B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B 
 A B A B A B A B A B A B A B A B A B A B A B A B A B A B
Thread A und B anhalten: mA.stop();mB.stop();

Code 2.1-3: Konsolenausgabe des obigen Programms

Verzweigen und wieder zusammenführen - thread002

  • Zwei Prozesse mA und mB werden erzeugt und parallel ausgeführt.
  • Dann werden beide Prozesse vom Hauptprogramm aus beobachtet und gestoppt, wenn beide Prozesse ihre Befehle abgearbeitet haben.
  • Angenommen beide Threads würden Berechnungen durchführen, die von einem Folgeprozess gebraucht würden, dann könnte durch diese Technik gewährleistet werden, dass vor der Weiterverarbeitung auch beide Berechnungen zuende durchgeführt wurden.
Verzweigung als Prozessfluss-Graph

Bild 2.1-2: Verzweigung als Prozessfluss-Graph

public class MeinThread extends Thread
{
    private int maxschritte;
    MeinThread(String name, int maxschritte)
    {
        this.maxschritte = maxschritte;
        setName(name);
    }
    public void run()
    {
        for(int i=0;i<maxschritte;i++)
        {
            System.out.print(" "+getName()+i);
            try
            {
                Thread.sleep(100);
            }
            catch(Exception e)
            {
            }
        }
    }
}

Code 2.1-4: MeinThread.java - Neue von Klasse Thread erbende Java-Klasse "MeinThread"

public class Hauptprogramm
{
    public static void pausieren()
    {
        try
        {
            Thread.sleep(500);
        }
        catch(Exception e)
        {
        }
    }
    public static void main(String[] args)
    {
        MeinThread mA = new MeinThread("A",10);
        MeinThread mB = new MeinThread("B",20);
        System.out.println("\nThread A und B starten: mA.start();mB.start();\n");
        mA.start();
        mB.start();
        while( mA.isAlive() || mB.isAlive() )
        {
             if(mA.isAlive() && mB.isAlive())
                 System.out.print("\n A_B_busy. \n");
             else if(mA.isAlive())
                 System.out.print("\n A_busy. \n");
             else if(mB.isAlive())
                 System.out.print("\n B_busy. \n");
             pausieren();
        }
        mA.stop();
        mB.stop();
    }
}

Code 2.1-5: Hauptprogramm.java - Neues Hauptprogramm, das nach Erzeugen und Start zweier Prozesse auf deren Ende wartet.

Thread A und B starten: mA.start();mB.start();
 A_B_busy. 
 A0 B0 A1 B1 A2 B2 A3 B3 A4 B4
 A_B_busy. 
 A5 B5 A6 B6 A7 B7 A8 B8 A9 B9
 A_B_busy. 
 B10 B11 B12 B13 B14
 B_busy. 
 B15 B16 B17 B18 B19
 B_busy. 

Code 2.1-6: Konsolenausgabe des obigen Programms