Java Thread Programmierung

Praktikum: Parallele und Verteilte Programmierung mit Java
Draft schlechte eingedeutschete version
http://mows.rz.uni-mannheim.de/java/praktikum/thread/

Thread

Ein Java-Prozess kann mit Threads mehrere Dinge gleichzeitig machen. Jeder Thread hat seinen eigenen Programmszähler und kann verschiedene Programmsbefehle selbständig ausführen. In solchen Programme kann z.B. ein Thread Data aus dem I/O lesen, während ein zweites Thread Data zum I/O schreibt, während ein drittesr Thread etwas rechnet und schliesslich ein viertes Thread die GUI darstellt. Für multi-threaded Programme muss man die folgende beachten:

Erzeugung - Thread Creation

Es gibt zwei Wege, ein Thread zu erzeugen. Der erste beuntzt eine Klasse, die die Thread Klasse (in java.lang) erweitert. Wenn ein Objekt von dieser Klasse mit new erzeugt und danach seine start() Methode aufgerufen wird, startet das Thread sein Lauf und führt die run Methode dieser Klasse. Als Beispiel definieren wir eine Klasse namens WorkOne.java:
public class WorkOne extends Thread {
   String name;
   int limit;

   public WorkOne(String s, int n) {
      name = s;
      limit = n;
   }

   // adds numbers from 1 to limit
   public void run() {
      long sum = 0;
      for (int i=0; i <= limit; i++) {
          sum += i;
      }
      System.out.println(name+"-"+getName()+": SUM"+limit+" -> "+sum);
   }
}
und WorkOneApp.java
public class WorkOneApp {
  public static void main(String[] args) {
    WorkOne work1 = new WorkOne("A", 1000000);
    WorkOne work2 = new WorkOne("B", 100000);
    WorkOne work3 = new WorkOne("C", 10000);
    WorkOne work4 = new WorkOne("D", 100000);
    WorkOne work5 = new WorkOne("E", 1000000);
    WorkOne work6 = new WorkOne("F", 500000);

    work1.start();
    work2.start();
    work3.start();
    work4.start();
    work5.start();
    work6.start();
  }
}

Die main() Methode dieser Klasse erzeugt sechs WorkOne Objekte und dann startet diese Objekte mit start(). Als Ergebniss bekommt man:

@> java WorkOneApp
B-Thread-5: SUM100000 -> 5000050000
C-Thread-6: SUM10000 -> 50005000
A-Thread-4: SUM1000000 -> 500000500000
D-Thread-7: SUM100000 -> 5000050000
E-Thread-8: SUM1000000 -> 500000500000
F-Thread-9: SUM500000 -> 125000250000
Der zweite benutzt eine Klasse, die die Runnable (in java.lang) Interface implementiert. Wenn ein Objekt von Thread mit dieser Klasse als Parameter erzeugt und danach die start() Methode dieser Thread aufgerufen wird, startet das Thread sein Lauf und führt die run Methode dieser Klasse. Als Beispiel definieren wir eine Klasse namens WorkTwo.java:
public class WorkTwo implements Runnable {
   String name;
   int limit;

   public WorkTwo(String s, int n) {
      name = s;
      limit = n;
   }

   // adds numbers from 1 to limit
   public void run() {
      long sum = 0;
      for (int i=0; i <= limit; i++) {
          sum += i;
      }
      System.out.println(name+"-"+Thread.currentThread().getName()+": SUM"+limit+" -> "+sum);
   }
}
und WorkTwoApp.java
public class WorkTwoApp {
  public static void main(String[] args) {
    WorkTwo work1 = new WorkTwo("A", 1000000);
    WorkTwo work2 = new WorkTwo("B", 100000);
    WorkTwo work3 = new WorkTwo("C", 10000);
    WorkTwo work4 = new WorkTwo("D", 100000);
    WorkTwo work5 = new WorkTwo("E", 1000000);
    WorkTwo work6 = new WorkTwo("F", 500000);

    Thread th_work1 = new Thread(work1);
    Thread th_work2 = new Thread(work2);
    Thread th_work3 = new Thread(work3);
    Thread th_work4 = new Thread(work4);
    Thread th_work5 = new Thread(work5);
    Thread th_work6 = new Thread(work6);

    th_work1.start();
    th_work2.start();
    th_work3.start();
    th_work4.start();
    th_work5.start();
    th_work6.start();
  }
}

Die main() Methode dieser Klasse erzeugt zuerst sechs
WorkTwo Objekte und danach erzeugt sechs Threads mit
diesen Objekten. Schliesslich werden die start()
Mehothode dieser Threads ausgeführt.

Als Ergebniss bekommt man:

@> java WorkTwoApp
B-Thread-5: SUM100000 -> 5000050000
C-Thread-6: SUM10000 -> 50005000
D-Thread-7: SUM100000 -> 5000050000
A-Thread-4: SUM1000000 -> 500000500000
F-Thread-9: SUM500000 -> 125000250000
E-Thread-8: SUM1000000 -> 500000500000