Zum Inhalt springen

Threads


Ben2013

Empfohlene Beiträge

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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"

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Mutex
Was ist das?
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von uenetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...