Ben2013 Geschrieben 1. April 2013 Geschrieben 1. April 2013 Hi, ich hab mal ein paar Fragen zu Threads. 1. Wie kann ich Threads löschen? Beispiel: while(Benutzer hat Lust auf den knopf zu drücken) { -Benutzer erzeugt 100 Threads. -Programm fertig -Threads werden nicht mehr gebraucht } Sowohl mit .interrupt(), als auch mit .stop() [ja veraltet ich weiß] zeigt mir mein CPU 100, 200, 300, 400, 500 Threads an und ist entsprechen überlastet 2. Alle 100 Threads rufen die gleiche Methode in der Steuerklasse aller Threads auf. -> Die Threads beeinflussen sich jetzt gegenseitig beim ändern von Variablen in der Steuerklasse oder? (Wenn nein hab ich ein anderes problem) Zitieren
flashpixx Geschrieben 1. April 2013 Geschrieben 1. April 2013 Die Beschreibung ist so nicht ausreichend !? Was ist eine Steuerklasse? Ein Thread ist zunächst einmal ein normales Javaobjekt und unterliegt analog den gleichen Strukturen, auf was der Thread zugreift ist von Dir abhängig, nur solltest Du beachten, dass Du eben wenn mehrere Thread auf die gleiche Speicherposition zugreifen eben durch einen Mutex abgesichert werden (sofern die Speicherinformation verändert wird). Ein Thread führt eine Methode aus, die eben so lange läuft, wie Du es programmiert hast, das Threadobjekt bleibt letztendlich auch nach dem Beenden der Methode existent bis es durch den GC entfernt wird, d.h. aber es dürfen zu dem Objekt keine Abhängigkeiten existieren. Es ist überhaupt nicht sinnvoll 100 oder 500 Threads zu erzeugen, denn defakto kann das System nur so viele Thread parallel abarbeiten, wie durch die Hardware möglich ist (pro Core = 1 oder 2 Threads [Hypervision]). Alle anderen Threads werden pausiert, d.h. mehr Threads zu erzeugen führt nicht zu einer schnelleren Lösung. Du solltest zuerst einmal den Algorithmus single-thread formulieren und zusehen, dass dieser fehlerfrei läuft. Danach solltest Du Dich mit den Problemen der Nebenläufigkeit und deren technische Umsetzung im System befassen, damit Du weißt, wie das System Nebenläufigkeiten real abbildet. Im nächsten Schritt kannst Du Dir überlegen, wie Du Deinen Algorithmus parallelisierst und welche Probleme es dabei gibt. Es scheint mir, dass Du hier einfach mit "Threadding auf ein Problem draufhaust, ohne Dir Gedanken über die Problematik zu machen" Zitieren
Ben2013 Geschrieben 1. April 2013 Autor Geschrieben 1. April 2013 Der Algorithmus funktioniert ja schon (bzw. hat funktioniert) Steuerklasse meinte die Klasse, die die Threads erzeugt und startet. Und ja die vielen Threads haben sinn, da sie zu unterschiedlichen Zeitpunkten erzeugt werden und immer die sleep Methode aufruhen. Danke für das mit dem Abbrechen. Hab meine Schleife noch mal überdacht und denke dass ich sie überarbeiten kann. MutexWas ist das? Zitieren
Ben2013 Geschrieben 1. April 2013 Autor Geschrieben 1. April 2013 OK. Galileo Computing :: Java ist auch eine Insel – 14.5 Synchronisation über kritische Abschnitte Zitieren
flashpixx Geschrieben 1. April 2013 Geschrieben 1. April 2013 Und ja die vielen Threads haben sinn, da sie zu unterschiedlichen Zeitpunkten erzeugt werden und immer die sleep Methode aufruhen. Nein 500 Threads machen keinen Sinn (siehe die theoretische Grundlage Amdahlsches Gesetz ) Da Du Java Anfänger zu sein scheinst (aufgrund Deiner anderen Threads), rate ich ganz dringend dazu, dass Du erst einmal verstehst, wie Java arbeitet, bevor Du hier mit Threads und Nebenläufigkeiten arbeitest. Dass Du den Begriff Mutex nicht kennst, zeigt dass Du keine Vorstellung hast, wie überhaupt Threadding i. Allgm. funktioniert. Mich graut es wirklich davor, wenn ich höre, dass Du 500 Threads erzeugst und dann davon gefühlte 99% im Sleep hast, denn Dein Core kann nur wenige Threads parallel abarbeiten. 500 Threads zu erzeugen ist völlig sinnbefreit, denn Dein Problem wird gar nicht die Komplexität haben, dass das rechtfertigt. Ich habe hier als Vergleich Probleme, die eine gesamt Last von ca 500 GB im Ram erzeugen über mehrere Clusternodes verteilt und auf jedem Core laufen nur 2 Threads parallel. Ich erzeuge gar nicht erst mehr, sondern genau so viel, wie die Hardware zulässt. Bei 48 Cores macht, dass dann 96 Threads auf 6 physikalischen Maschinen mit je 8 Cores. Threadding ist nicht umsonst, d.h. durch das Threadding erzeugt man auch einen gewissen Overhead, d.h. ist die Komplexität des Problems nicht groß genug, ist der Overhead teurer, als den Speed-Up den man erreicht. Zusätzlich bringt Threadding nur etwas, wenn der Algorithmus sich sinnvoll parallelisieren lässt. Wenn man ständig Synchronisieren muss, wird das ineffizient. Nebenläufigkeit ist nicht der erste Punkte, den man optimieren sollte, zusätzlich sollte man mit Bedacht dies einsetzen Was ist das? Mutex Zitieren
uenetz Geschrieben 1. April 2013 Geschrieben 1. April 2013 1. Wie kann ich Threads löschen? Schon wieder ein Beitrag, bei dem man raten soll, was Du machst oder zu tun gedenkst. Oftmals hilft der Quellcode der Problemzone bei der Aufklärung und erleichtert den etwaigen Hilfeleistenden die Arbeit. Davon abgesehen hat @flashpixx bereits seine Meinung zu Deinem Threading mitgeteilt. :old Zitieren
Ben2013 Geschrieben 2. April 2013 Autor Geschrieben 2. April 2013 Nein 500 Threads machen keinen Sinn (siehe die theoretische Grundlage Amdahlsches Gesetz ) Ich versteh die Aufgabenstellung so Da Du Java Anfänger zu sein scheinst (aufgrund Deiner anderen Threads), rate ich ganz dringend dazu, dass Du erst einmal verstehst, wie Java arbeitet, bevor Du hier mit Threads und Nebenläufigkeiten arbeitest. Dass Du den Begriff Mutex nicht kennst, zeigt dass Du keine Vorstellung hast, wie überhaupt Threadding i. Allgm. funktioniert. 3 Jahre Schulinformatik -> 1 Demo-Programm zum Threading Schon wieder ein Beitrag, bei dem man raten soll, was Du machst oder zu tun gedenkst. Oftmals hilft der Quellcode der Problemzone bei der Aufklärung und erleichtert den etwaigen Hilfeleistenden die Arbeit. Würd' ich glatt posten, nur darf ich das nicht. Und: Wieso raten? Denke das ist ziemlich eindeutig: while(Benutzer hat Lust auf den knopf zu drücken) { -Benutzer erzeugt 100 Threads. -Programm fertig -Threads werden nicht mehr gebraucht } Es werden viele Theras erstellt -> die werden nicht mehr benötigt -> bestehen weiter Zitieren
uenetz Geschrieben 2. April 2013 Geschrieben 2. April 2013 (bearbeitet) Es werden viele Theras erstellt -> die werden nicht mehr benötigt -> bestehen weiter Vielleicht so ??? Ich poste einmal eine Antwort in Deiner Form und hoffe Du verstehst, wie ich es meine. while(Benutzer hat Lust auf den knopf zu drücken) { /* Erstelle 100 Objekte von Threads */ /* 100 mal TObj.start(); */ /* 100 mal TObj.stop(); */ /* Programm beenden */ } Bearbeitet 2. April 2013 von uenetz Zitieren
flashpixx Geschrieben 2. April 2013 Geschrieben 2. April 2013 Ich versteh die Aufgabenstellung so Weder in der Schule, noch in der Ausbildung, noch im Studium oder im Berufsleben ist mir so eine Aufgabe untergekommen, in der verlangt worden wäre 500 Threads zu erzeugen. Das ist sowohl von theoretischer, wie auch praktischer Sicht völlig sinnlos. Und: Wieso raten? Denke das ist ziemlich eindeutig: while(Benutzer hat Lust auf den knopf zu drücken) { -Benutzer erzeugt 100 Threads. -Programm fertig -Threads werden nicht mehr gebraucht } Es werden viele Theras erstellt -> die werden nicht mehr benötigt -> bestehen weiter Wenn Du keine Anmerkungen zu der Problemstellung posten kannst d.h. z.B. den Wortlaut der Aufgabenstellung oder Codeauszüge, dann kann Dir hier auch niemand helfen. Ich formuliere es mal in Bezug auf Deinen anderen Thread http://www.fachinformatiker.de/java/156618-programm-bleibt-stehen.html so, dass Dein Lösungsalgorithmus extrem ineffizent ist und Du versucht durch "technische Spielerei (Threads)" die Ineffizienz zu lösen. Sofern Du also hier nicht bereit bist mehr Details zu dem Problem zu zeigen, wird man Dir nicht helfen können. Zitieren
uenetz Geschrieben 2. April 2013 Geschrieben 2. April 2013 Weder in der Schule, noch in der Ausbildung, noch im Studium oder im Berufsleben ist mir so eine Aufgabe untergekommen, in der verlangt worden wäre 500 Threads zu erzeugen. Ich kann die Schulform nur erraten: Baumschule *g Zitieren
Ben2013 Geschrieben 2. April 2013 Autor Geschrieben 2. April 2013 Vielleicht so ??? Ich poste einmal eine Antwort in Deiner Form und hoffe Du verstehst, wie ich es meine. while(Benutzer hat Lust auf den knopf zu drücken) { /* Erstelle 100 Objekte von Threads */ /* 100 mal TObj.start(); */ /* 100 mal TObj.stop(); */ /* Programm beenden */ } Ja genau sowas hätte gereicht. Aber deine Lösung geht nicht while(Benutzer hat Lust auf den knopf zu drücken) { -Benutzer erzeugt 100 Threads. -Programm fertig -Threads werden nicht mehr gebraucht } da hier kein "beenden" steht, heißt das, dass das programm noch nicht beendet wird Sowohl mit .interrupt(), als auch mit .stop() [ja veraltet ich weiß] zeigt mir mein CPU 100, 200, 300, 400, 500 Threads an und ist entsprechen überlastet siehe auch hier .stop hat nicht funktioniert hab das Problem aber schon so gelöst, dass ich die dauerschleife aus der run methode genommen hab siehe: Danke für das mit dem Abbrechen. Hab meine Schleife noch mal überdacht und denke dass ich sie überarbeiten kann. ------------------------------------------------------------------------------ Weder in der Schule, noch in der Ausbildung, noch im Studium oder im Berufsleben ist mir so eine Aufgabe untergekommen, in der verlangt worden wäre 500 Threads zu erzeugen. Das ist sowohl von theoretischer, wie auch praktischer Sicht völlig sinnlos. Es werden so viele Threads erzeugt, wie der Benutzer Lust hat. Ich finde das kann man aus der schleife auch erkennen. ------------------------------------------------------------------------------ Ich formuliere es mal in Bezug auf Deinen anderen Thread http://www.fachinformatiker.de/java/...bt-stehen.html so, dass Dein Lösungsalgorithmus extrem ineffizent ist und Du versucht durch "technische Spielerei (Threads)" die Ineffizienz zu lösen. Sofern Du also hier nicht bereit bist mehr Details zu dem Problem zu zeigen, wird man Dir nicht helfen können. Nein, ich versuche keine Ineffizienz zu lösen. siehe einen punkt hier drüber Es werden so viele Threads erzeugt, wie der Benutzer Lust hat. Ich finde das kann man aus der schleife auch erkennen. ------------------------------------------------------------------------------ Ich kann die Schulform nur erraten: Baumschule *g Es ist keine Schul-, Ausbildungs-, Studiums- oder Berufs-aufgabe PS: Schulform bleibt geheim. Ich halte viel von Anonymität im internet Zitieren
flashpixx Geschrieben 2. April 2013 Geschrieben 2. April 2013 Es werden so viele Threads erzeugt, wie der Benutzer Lust hat. Ich finde das kann man aus der schleife auch erkennen. Wieso darf überhaupt der User Kontrolle darüber haben wie viele Threads im System laufen? Auf welcher fachlichen Grundlage kannst Du das rechtfertigen? Die Anzahl der Threads ist abhängig von der Hardware und es Algorithmus, nicht von der Laune des Users. Zitieren
Ben2013 Geschrieben 2. April 2013 Autor Geschrieben 2. April 2013 Wieso darf überhaupt der User Kontrolle darüber haben wie viele Threads im System laufen? Auf welcher fachlichen Grundlage kannst Du das rechtfertigen? Die Anzahl der Threads ist abhängig von der Hardware und es Algorithmus, nicht von der Laune des Users. Stell dir folgendes vor (auch wenn es totaller schwachsinn ist): auf dem bildschirm ist eine Weltkarte der benutzer wird gefragt, wie viele uhren (mit der lokalen uhrzeit am erzeugten Ort) der benutzer gibt "10" ein -> es werden 10, zufällig auf der karte verteilte, uhren erzeugt, die ihre uhrzeit anzeigen der benutzer gibt "100" ein -> es werden 100, zufällig auf der karte verteilte, uhren erzeugt, die ihre uhrzeit anzeigen der benutzer gibt "1000" ein -> es werden 1000, zufällig auf der karte verteilte, uhren erzeugt, die ihre uhrzeit anzeigen ... da alle uhren threads sind (in meinem programm übertragen) entscheidet der user wie viele threads es gibt. -> JA, ich hab es schon geschafft den ganzen Mac lahm zu legen Ging nur noch Maus (komischer weise) und powerschalter Zitieren
uenetz Geschrieben 2. April 2013 Geschrieben 2. April 2013 Stell dir folgendes vor (auch wenn es totaller schwachsinn ist): auf dem bildschirm ist eine Weltkarte da alle uhren threads sind (in meinem programm übertragen) entscheidet der user wie viele threads es gibt. Reicht denn da nicht ein Thread und oder ein Timer-Objekt zur Lösung? Zitieren
flashpixx Geschrieben 2. April 2013 Geschrieben 2. April 2013 Stell dir folgendes vor (auch wenn es totaller schwachsinn ist): auf dem bildschirm ist eine Weltkarte der benutzer wird gefragt, wie viele uhren (mit der lokalen uhrzeit am erzeugten Ort) der benutzer gibt "10" ein -> es werden 10, zufällig auf der karte verteilte, uhren erzeugt, die ihre uhrzeit anzeigen der benutzer gibt "100" ein -> es werden 100, zufällig auf der karte verteilte, uhren erzeugt, die ihre uhrzeit anzeigen der benutzer gibt "1000" ein -> es werden 1000, zufällig auf der karte verteilte, uhren erzeugt, die ihre uhrzeit anzeigen da alle uhren threads sind (in meinem programm übertragen) entscheidet der user wie viele threads es gibt. Wieso muss jede Uhr in einem eigenen Thread laufen? Die Uhren werden im Grunde auf die Systemzeit synchronisiert, d.h. es reicht ein Thread. Da die Zeit auf jeder Uhr nicht schneller oder langsamer läuft als auf allen anderen braucht man nicht so viele Threads wie Uhren. Denn die Uhren sind nicht unabhängig von der Zeit und die Zeit wiederum ist nicht unabhängig von der Welt. Zeitzonenumrechnung gibt es fertig. Eine Sekunde bleibt überall auf den Uhren eine Sekunde. Deine Herangehensweise ist völlig falsch. Ein Thread der die Zeit darstellt und eine entsprechende Eventstruktur um alle Uhren upzudaten, wäre der richtige Ansatz ggf dazu dann noch ein GUI Threads Zitieren
Ben2013 Geschrieben 3. April 2013 Autor Geschrieben 3. April 2013 OK! ihr habt es nicht anders gewollt. -> Die Uhren befinden sich alle in verschiedenen Raumschiffen, die wild mit naher Lichtgeschwindigkeit durch den Weltraum fliegen. Hoffentlich könnt ihr auch Relativitätstheorie von Einstein. (Und nein das ist nicht mein richtiges Problem) Zitieren
Klotzkopp Geschrieben 3. April 2013 Geschrieben 3. April 2013 Sag uns einfach, welche Antwort du hören willst, damit das hier zu einem Ende kommt. Hier ist kein Kindergarten. Zitieren
uenetz Geschrieben 3. April 2013 Geschrieben 3. April 2013 Okay, Du hast es nicht verstanden! 1. Aufgaben in so viele Threads zu lagern, ist absoluter Nonsens. Das von Dir verfolgte Konzept ist absolut das Falsche. 2. Was hat Einsteins Theorie mit Deinem Verständnis zu tun? 3. ... Entschuldige bitte, aber was soll man noch weiter antworten ? Antworten in der Art wie Du sie gibst, sollte man einfach nicht geben Zitieren
Ben2013 Geschrieben 3. April 2013 Autor Geschrieben 3. April 2013 hab das Problem aber schon so gelöst, dass ich die dauerschleife aus der run methode genommen hab siehe: Also ich bin schon mit diesem Problem fertig. Nur scheinen hier einige nicht zu verstehen, dass wenn ich der Aufgabenstellung steht "erzeuge x threads" dass ich dann auch x threads erzeuge Zitieren
uenetz Geschrieben 3. April 2013 Geschrieben 3. April 2013 Prima, dann ist das Thema ja abgeschlossen. Ich wünsche Dir bei weiteren Aufgabestellungen viel Erfolg. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.