# Threads...



## tanja (2. Dez 2009)

hallo;
 ich habe so ein programmstück. ich muss hier 2 objekte instanziieren. und zwar thread1 und thread2 mit den Parametern  ("->Thread1",1200,5) bzw. ("->Thread2",2700,3).

    Die Klasse BspThread hat die methoden run() und start() von Thread geerbt!!
Wie probiere ich hier alle vier Möglichkeiten des aufrufs für run() oder start()s für die beiden Threads aus?
   und wichtig ist was ist der unterschied überhaupt zwischen run und start?
-----------------------------------------------------------------------------------------------
class BspThread extends Thread {
	private String t; private int wz, a;

	/*Wartezeit wzeit im Milisekunden*/
	BspThread(String text, int wzeit, int anz) {
		t=text; wz=wzeit; a=anz;

	}

	public void run() {
		try{
			for (int n=0; n<a; n++) {
				sleep(wz);
				System.out.println(t);

			}
			System.out.println("Beendet!_"+t);

		}catch (Exception e) {
			System.out.println("Ausnahme:_"+e.getClass());
		}
	}
}
-----------------------------------------------------------------------------------------------
Das program gibt als Ausgabe:
>C:\Program Files\Java\jdk1.6.0_17\bin\javac BspThearead.java
>Exit code: 0
>C:\Program Files\Java\jdk1.6.0_17\bin\javac BspThearead.java
>Exit code: 0
>java -cp . BspThearead
java.lang.NoClassDefFoundError: BspThearead
Caused by: java.lang.ClassNotFoundException: BspThearead
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: BspThearead.  Program will exit.
Exception in thread "main" >Exit code: 1


----------



## tanja (2. Dez 2009)

hmm..hier habe ich eine möglichkeit:

===thread1.run();==
===thread2.run();==
===================
->Thread1
->Thread1
->Thread1
->Thread1
->Thread1
Beendet! ->Thread1
->Thread2
->Thread2
->Thread2
Beendet! ->Thread2
----------------------------------------------------------------------------------
Erklärung: Es wird zurst thread1.run(); und dann thread2.run(); ausgeführt,
 die JVM wartet also, bis thread1.run(); "fertig" ist.

    OHNE GEWÄHR:noe:


----------



## The_S (2. Dez 2009)

Du stellst deine Fragen ganz schön irritierend  . Und verwende in Zukunft bitte Code/Java-Tags. Macht deinen Code lesbarer.



tanja hat gesagt.:


> Erklärung: Es wird zurst thread1.run(); und dann thread2.run(); ausgeführt,
> die JVM wartet also, bis thread1.run(); "fertig" ist.
> 
> OHNE GEWÄHR:noe:



Stimmt schon so grob  . Nur mit dem Aufruf von "start" wird der Code in der "run"-Methode auch wirklich in einem neuen Thread (also parallel) gestartet. Rufst du "run" auf, ist das ein einfacher Methodenaufruf, der sequentiell abgearbeitet wird.


----------



## w0ddes (3. Dez 2009)

tanja hat gesagt.:


> java.lang.NoClassDefFoundError: BspThearead
> Caused by: java.lang.ClassNotFoundException: BspThearead
> at java.net.URLClassLoader$1.run(Unknown Source)
> at java.security.AccessController.doPrivileged(Native Method)
> ...



das hier lässt sich auf ne falsche Beschriftung / falschen Aufruf in der Konsole zurückführen. Sollte natürlich "BspThread" heißen, nicht "BspThearead"


----------



## tanja (3. Dez 2009)

Ouu..voll versehen.. Danke.. und habe noch die andere 3 möglichkeiten so wie unten ausgeführt. wenn die richtig sind..und zwar,,
===================
==thread1.start();=
==thread2.start();=
===================
->Thread1
->Thread1
->Thread2
->Thread1
->Thread1
->Thread2
->Thread1
Beendet! ->Thread1
->Thread2
Beendet! ->Thread2
Bei thread1.start(); führt die JVM die in der Klasse enthaltene run()-Methode aus und geht gleich zur nächsten Zeile und führt die in thread2 enthaltene run()-Methode aus (auch per start()). Die Anweisungen in den beiden Methoden laufen also gleichzeitig und weil die Wartezeit der Methode in der zweiten Klasse höher ist, hat die erste Zeit 2 Meldungen auszugeben, bevor die Zeit für die 2te gekommen ist und die Methode in der  ersten Klasse entsprechend schneller fertig ist.

===================
===thread1.run();==
==thread2.start();=
===================
->Thread1
->Thread1
->Thread1
->Thread1
->Thread1
Beendet! ->Thread1
->Thread2
->Thread2
->Thread2
Beendet! ->Thread2
Erklärung: Es wird zurst thread1.run(); direkt ausgeführt und erst dann thread2.run(); über die geerbte start() ausgeführt, die JVM wartet also, bis thread1.run(); "fertig" ist.

===================
==thread1.start();=
===thread2.run();==
===================
->Thread1
->Thread1
->Thread2
->Thread1
->Thread1
->Thread2
->Thread1
Beendet! ->Thread1
->Thread2
Beendet! ->Thread2
Die Situation ist die gleiche wie bei thread1.start(); thread2.start();, es ist egal, ob in der zweiten Anweisung run() direkt oder über start() angesprochen wird, weil weil die Anweisungen in der ersten Zeile schon laufen und die JVM schon zur zweiten Zeil übergagangen ist. Weil nix nach der zweiten Anweisung kommt, ändert sich die Ausgabe nicht.


----------

