Java - Threads und Scheduling!

Gast #3171166
Lesenswert?

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 #3171178
Lesenswert?

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.
#3171189
Lesenswert?

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 #3171212
Lesenswert?

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.
#3171254
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren