Java - Threads und Scheduling!

Gast #3171166
Hallo, ich habe zum Test ein einfaches Programm geschrieben in dem zwei 
Threadklassen in der Main Klasse instanziert und gestartet werden.
Alle Threads haben meiner Meinung nach die gleiche Priorität

Ausgabe:

Thread A wird ausgefuehrt
Thread B.1
 wird ausgefuehrt
Thread B.3
 wird ausgefuehrt
Thread B.2
 wird ausgefuehrt
main thread
Thread B.4
 wird ausgefuehrt
Thread A wird ausgefuehrt
Thread B.2
 wird ausgefuehrt
Thread B.3
 wird ausgefuehrt
main thread again
...


Wieso wird nun Thread 3 vor Thread 2 abgearbeitet? Wann wird zum Main 
thread "zurückgesprungen"?

Wenn man das Programm mehrmals ausführt ändert sich die 
Abarbeitungsreihenfolge...



Code:

import java.lang.String;
import java.lang.Thread;

class Thread_A extends Thread
{

  public void run()
  {
    while(true)
    {
    System.out.println("Thread A wird ausgefuehrt");
      try{
        sleep(1000);
         }catch(Exception e) {};
    }
  }
}

class Thread_B extends Thread
{

static int count=1;
int Id;
Thread_B()
{
 Id=count;
 count++;
}

      public void run()
  {
    for(int i=0;i<Id;i++)
    {
    System.out.println("Thread B." +Id);
    System.out.println(" wird ausgefuehrt");
    try{
      sleep(1000);
       }catch(Exception e) {};
    }
  }

}

class Thread_Test
{


public static void main(String[] args)
{

System.out.println(Thread.currentThread().getPriority());
  Thread_A Anton1= new Thread_A();
  Anton1.start();

  for(int i=1;i<5;i++)
  {
    Thread_B Berta = new Thread_B();
    Berta.start();

  }

System.out.println("main thread");
    try{

      Thread.sleep(1000);
       }catch(Exception e) {};
    System.out.println("main thread again");
}
}
Gast
Essah schrieb:
> Wieso wird nun Thread 3 vor Thread 2 abgearbeitet?
weil es nicht definiert ist.

> Wann wird zum Main
> thread "zurückgesprungen"?
mein ist auch nur ein Thread er kommt dran, wenn der Scheduler denkt es 
ist mal wieder so weit.

> Wenn man das Programm mehrmals ausführt ändert sich die
> Abarbeitungsreihenfolge...
das es nicht definierst ist, hängt es vom Scheduler ab und was sonst 
noch am System läuft.

Wenn du eine spezielle Reihenfolge willst, dann musst du selber dafür 
sorgen.
Durch das starten eines threads entkoppelst du teile und dies führt zu 
einem asynchronen Ablauf.

Asynchron bedeutet, dass du keinen Einfluss mehr darauf hast, in welcher 
Reihenfolge und wann nun ein Objekt rechenzeit bekommt.
Nichtsdestotrotz gibt es mittel zur Synchronisierung

zuruckgesprungen wird eigentlich gar nicht mehr.
Sie können aber kommunizieren.
Dies geschieht uber ein Protokoll und ein Medium zum Austausch
z.b. Ethernet, gemeinsamer Speicher, etc.

Schöne Grüße :)
Persönliche Seite
Erst mal allgemein: Bitte nicht ohne Not "Thread" erweitern, dafür gibt 
es das Runnable Interface!

Und  wenn man das hat, und eine gewisses "Scheduling" Verhalten 
erreichen möchte, kann man sich die verschiedenen Executors ansehen, da 
kannst du dann bestimmen ob die Aufgaben:
- Nacheinander
- Zu bestimmten Zeitpunkten
- "Sobald wie möglich" aber ohne feste Reihenfolge...
- ...

abgearbeitet werden.
Stefan Rand schrieb:
> Markus Borti schrieb:
>> Dies geschieht uber ein Protokoll und ein Medium zum Austausch
>> z.b. Ethernet, gemeinsamer Speicher, etc.
>
> Du läßt Threads über Ethernet miteinander kommunizieren? *staun*

wenn es sein muss gewiss.
Z.b. Wenn sie auf unterschiedlichen Rechnern laufen (okay.. Da ist es 
wohl gleich ein ganzer Prozess) oder wenn die Gegebenheiten nichts 
anderes hergeben.
Abgesehen davon kann man sich Kommunikation uber ein Netzwerk bzw die 
Synchronisation damit recht gut vorstellen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.