Forum: PC-Programmierung Java - Threads und Scheduling!


von Essah (Gast)


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");
}
}

von Peter II (Gast)


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.

von Markus B. (markusborti)


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 :)

von Stefan R. (srand)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

Stefan Rand schrieb:
> Du läßt Threads über Ethernet miteinander kommunizieren? staun

immer noch besser als über ein Datei im Dateisystem.

von Läubi .. (laeubi) Benutzerseite


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.

von Markus B. (markusborti)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.