Anfängerfrage zu Threads

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo!

Habe im Netz folgendes Programm gefunden.
Code:
(1)public class ThreadBased1
(2){
(3)	public static void main(String[] argv)
(4)	{
(5)		HelloThread northGerman = new HelloThread( "Moin Moin" );
(6)		HelloThread southGerman = new HelloThread( "Gruess Gott" );
(7)
(8)		northGerman.start();
(9)		southGerman.start();
(10)
(11)		System.out.println( "threads started ..." );		
(12)	} //end main()
(13)} //end class ThreadBased1
(14)// *****************************************************************
(15)class HelloThread extends Thread
(16){
(17)	protected String greetingText;
(18)
(19)	public HelloThread (String greetingText)
(20)	{
(21)		this.greetingText = greetingText;
(22)	} //standard constructor
(23)
(24)	public void run()
(25)	{
(26)		while (true)
(27)		{
(28)			try
(29)			{
(30)				Thread.sleep(500);
(31)			} //try
(32)			catch (InterruptedException ie)
(33)			{
(34)				System.out.println("an InterruptedException occurred\n"+ie.toString()+"\n"+ie.getMessage() );
(35)			} //catch
(36)
(37)			System.out.println( greetingText);
(38)		} //while
(39)	} //run()
(40)}//class HelloThread

Nun zu meiner Frage. Der erste Thread (northGerman) startet...und kommt in die run() Methode. Dort ist aber eine Endlosschleife while(true). Wie startet nun der zweite Thread (southGerman)?? Ich dachte, der zweite Thread startet wenn der erste beendet ist. Dieser kommt aber nie aus der Schleife raus....folglich wird er nicht beendet...wei funktioniert das ???
 
Hi,

die start() Methode eines Thread blockiert nicht. Es wird ja ein neuer Thread erstellt und gestartet.
Der andere Thread, also der Main-Thread läuft ganz normal weiter, es sei denn, du machst ein join() auf den neuen Thread.
Dir ist aber schon klar, was Threads sind und für was sie verwendet werden, oder?

Grüße,
Matthias
 
Es soll dadurch eine quasiparallele Verarbeitung stattfinden. Ich dachte nur, dass ein Thread beendet sein muss bevor der andere starten kann.
 
hehe gut gekontert...
@gast
Die Sache ist die,
der main Thread startet und kommt an die Anweisung x.start(), es wird ein neuer Thread (zusätzlich zum mainthread) aufgerufen der auch sofort loslegt. Dieser Thread stoppt irgendwann (Auch bei Endlosschleifen), weil ihm die CPU keine Rechenzeit mehr gibt. Dann läuft ein anderer Thread weiter. Das ist pseudoparallelität, weil das zum Einen sehr schnell geht (und somit sehr parallel aussieht), zum anderen aber so erstmal unkontrollierbar ist. Man kann nicht vorhersagen, wann welcher Thread läuft und wann wlecher stoppt.
Um das zu kontrollieren gibt es verschieden sprachliche Hilfsmittel in Java. synchronized, wait und notify bzw notifyall.... Ausserdem natürlich diverse Strukturideen wie Semaphoren o.ä
 
Der Thread stopt nicht, sondern gibt lediglich die Kontrolle ab. Das passiert auch nicht 'irgendwann' sondern direkt beim Statement Thread.sleep(500);
 
byto hat gesagt.:
Der Thread stopt nicht, sondern gibt lediglich die Kontrolle ab. Das passiert auch nicht 'irgendwann' sondern direkt beim Statement Thread.sleep(500);
Das stimmt so auch nicht. Bei Thread.sleep(500) gibt der Thread in der Tat die Kontrolle ab, allerdings kann das OS einen Thread auch jederzeit unterbrechen. Und das tut ein OS für gewöhnlich auch laufend. Wann das OS den Thread unterbricht kann man dabei wirklich nicht wissen. Das hängt u.A. vom Scheduler und dessen Implementierung, von der Anzahl der 'parallel' laufenden Threads, usw. ab.

MfG,
Hilefoks
 
Hilefoks hat gesagt.:
byto hat gesagt.:
Der Thread stopt nicht, sondern gibt lediglich die Kontrolle ab. Das passiert auch nicht 'irgendwann' sondern direkt beim Statement Thread.sleep(500);
Das stimmt so auch nicht. Bei Thread.sleep(500) gibt der Thread in der Tat die Kontrolle ab, allerdings kann das OS einen Thread auch jederzeit unterbrechen. Und das tut ein OS für gewöhnlich auch laufend. Wann das OS den Thread unterbricht kann man dabei wirklich nicht wissen. Das hängt u.A. vom Scheduler und dessen Implementierung, von der Anzahl der 'parallel' laufenden Threads, usw. ab.

Die Theorie ist mir durchaus geläufig. Aber hier wurde eine konkrete Frage gestellt und auf die habe ich mich bezogen. Jeder Scheduler wird in der Praxis beim Thread.sleep() die Kontrolle abgeben.
 
Was wäre nun, wenn es diese slepp() Methode nicht geben würde? Würde der zweite Thread dann irgendwann loslaufen, unkontrolliert...also z.B. beim 10 Schleifendurchlauf???
 
Dann kannst Du es kaum voraussagen. Es könnte jedes mal anders sein, vielleicht aber auch 99mal so und dann auf einmal ganz anders. 😉 Statt sleep könntest Du auch yield() machen, aber das ist auch nur ein Hint an den Scheduler.

In der Praxis ist sleep schon ein ziemlich guter Garant dafür, dass ein anderer Thread an die Reihe kommt.
 
Alles klar, jetzt ist der "Mythos" Thread um einiges verständlicher ..vielen,vielen Dank 🙂 🙂
 
Hallo,
ich hätte auch eine Frage zu Threads. Gibt es auch Threads ohne Methode run() bzw. muss diese vorhanden sein???? Wenn ich einen Thread mit z.B. t.start() starte arbeitet dieser die Methode run() ab,was ist aber wenn diese nicht vorhanden ist? Oder habe ich irgendwas falsch verstanden????
 
Hi,

um eine Klasse threadable zu machen mußt du das Interface Runnable implementieren oder die Klasse Thread erweitern, also "implements Runnable" oder "extends Thread". Dabei bist du gezwungen die MEthode run() zu implementieren. Du kannst praktisch nicht anders, die Methode ist vorgeschrieben. 🙂

Grüße,
Matthias
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben