Java - Threads

Aus Wikizone
Wechseln zu: Navigation, Suche

Links[Bearbeiten]

http://openbook.galileocomputing.de/javainsel9/javainsel_14_002.htm#mj45ef6b526108a654e748170e45b47506

Thread über Vererbung von Thread[Bearbeiten]

  • Klasse erstellen die von Thread erbt
  • run() Methode mit gewünschter Funktionalität überschreiben
  • Objekt der Klasse erstellen
  • start() Methode aufrufen (nicht run() sonst läuft es nicht parallel)
public class DateThread extends Thread
{
  @Override public void run()
  {
    for ( int i = 0; i < 20; i++ )
      System.out.println( new Date() );
  }
}

Thread t = new DateThread();
t.start();
// oder
// new DateThread().start();

Vorteil: Der Konstruktor des Threads kann ohne runnable Objekt aufgerufen werden, weil das Objekt die run Methode schon geerbt hat.

Thread über implements Runnable[Bearbeiten]

  • Klasse erstellen die Runnable implementiert -> Vorteil extends ist frei für andere Vererbung
  • Aufgabe in run() definieren
  • Thread Objekt erstellen und diesem ein Objekt der neuen Klasse übergeben.
  • Thread mit start() starten

Beispiel[Bearbeiten]

package com.tutego.insel.thread;

public class DateCommand implements Runnable
{
  @Override public void run()
  {
    for ( int i = 0; i < 20; i++ )
      System.out.println( new java.util.Date() );
  }
}

class CounterCommand implements Runnable
{
  @Override public void run()
  {
    for ( int i = 0; i < 20; i++ )
      System.out.println( i );
  }
}

Thread t1 = new Thread( new DateCommand() );
t1.start();

Thread t2 = new Thread( new CounterCommand() );
t2.start();

Interrupting Threads[Bearbeiten]

Beispiel (Android)

Boolean flag = true;
Thread secondary = new Thread(new Runnable() {

@Override
public void run() {
    while (flag) {
    // do something
    }
 }
});

secondary.start(); //start the thread
flag = false; // this will force secondary to finish its execution
 try {
   secondary.join(); // wait for secondary to finish
   } catch (InterruptedException e) {
    throw new RuntimeException(e);
}

Beispiel

private volatile Thread runner;

public synchronized void startThread(){
  if(runner == null){
    runner = new Thread(this);
    runner.start();
  }
}

public synchronized void stopThread(){
  if(runner != null){
    Thread moribund = runner;
    runner = null;
    moribund.interrupt();
  }
}

public void run(){
  while(Thread.currentThread() == runner){
    //do stuff which can be interrupted if necessary
  }
}