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"); } }
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 :)
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
Stefan Rand schrieb: > Du läßt Threads über Ethernet miteinander kommunizieren? staun immer noch besser als über ein Datei im Dateisystem.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.