Java - Threads: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
Zeile 56: Zeile 56:
 
Thread t2 = new Thread( new CounterCommand() );
 
Thread t2 = new Thread( new CounterCommand() );
 
t2.start();
 
t2.start();
 +
</pre>
 +
 +
== Interrupting Threads ==
 +
<pre>
 +
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
 +
  }
 +
}
 
</pre>
 
</pre>

Version vom 9. März 2013, 18:24 Uhr

Links

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

Thread über Vererbung von Thread

  • 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

  • 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

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

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
  }
}