Java - Threads: Unterschied zwischen den Versionen
Aus Wikizone
(Die Seite wurde neu angelegt: „ == Thread über Vererbung von Thread == *Klasse erstellen die von Thread erbt * run() Methode mit gewünschter Funktionalität überschreiben * Objekt der Klasse…“) |
|||
| (5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
| + | == Links == | ||
| + | http://openbook.galileocomputing.de/javainsel9/javainsel_14_002.htm#mj45ef6b526108a654e748170e45b47506 | ||
== Thread über Vererbung von Thread == | == Thread über Vererbung von Thread == | ||
| Zeile 5: | Zeile 7: | ||
* Objekt der Klasse erstellen | * Objekt der Klasse erstellen | ||
* start() Methode aufrufen (nicht run() sonst läuft es nicht parallel) | * start() Methode aufrufen (nicht run() sonst läuft es nicht parallel) | ||
| + | <pre> | ||
| + | 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(); | ||
| + | </pre> | ||
| + | Vorteil: Der Konstruktor des Threads kann ohne runnable Objekt aufgerufen werden, weil das Objekt die run Methode schon geerbt hat. | ||
== Thread über implements Runnable == | == Thread über implements Runnable == | ||
* Klasse erstellen die Runnable implementiert -> Vorteil extends ist frei für andere Vererbung | * Klasse erstellen die Runnable implementiert -> Vorteil extends ist frei für andere Vererbung | ||
| Zeile 11: | Zeile 28: | ||
* Thread Objekt erstellen und diesem ein Objekt der neuen Klasse übergeben. | * Thread Objekt erstellen und diesem ein Objekt der neuen Klasse übergeben. | ||
* Thread mit start() starten | * Thread mit start() starten | ||
| + | |||
| + | === Beispiel === | ||
| + | <pre> | ||
| + | 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(); | ||
| + | </pre> | ||
| + | |||
| + | == Interrupting Threads == | ||
| + | '''Beispiel (Android)''' | ||
| + | <pre> | ||
| + | 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); | ||
| + | } | ||
| + | |||
| + | </pre> | ||
| + | |||
| + | '''Beispiel''' | ||
| + | <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> | ||
Aktuelle Version vom 9. März 2013, 18:29 Uhr
Links[Bearbeiten]
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
}
}