Hallo,
ich habe ein kleines Verständnisproblem mit Threads. Meine Ausgangslage ist wie folgt: Ich habe zum einen meinen Hauptthread, wo ich ganz am Anfang einen Nebenthread starte (in diesem wird auf Netzwerktraffic gewartet), wenn spezieller Traffic ankommt soll ein Objekt in dem Hauptthread geändert werden. Komischerweise wird das Objekt aber nicht geändert, er geht jedoch in die Methode die ich vom nebenläufigen Thread aus aufrufe rein.
Hier der HauptThread:
Java:
privateboolean test =false;publicTest(){inits();newNetworkThread(this);}publicvoidchangedByExternalThread(){
test =true}
Und der Nebenläufige Thread:
Java:
publicclassNetworkThreadextendsThread{privateTest t;newNetworkThread(Test t){this.t = t;start();}publicvoidrun(){try{ServerSocket ss =newServerSocket(7070);while(true){try{
ss.setSoTimeout(500);Socket s = ss.accept();ObjectInputStream ois =newObjectInputStream(s.getInputStream());
t.changedByExternalThread();}catch(SocketTimeoutException e){}}}catch(Exception e){
e.printStackTrace();}}}
Was ich nun gerne hätte, ist das wenn der NetworkThread einmal durchgelaufen ist, dass die Variable test sich auf true geändert hat. Leider geschieht dies jedoch nicht. Kann mir bitte jemand sagen, was ich noch falsch mache?
das mit dem Thread geht schon und die Variable wird auch geändert,
oder bitte vollständiges Programm mit Ausgabe posten die gegenteiliges plausibel erscheinen läßt
wahrscheinlich aber sinnvoller: mehr vom Originalprogramm posten,
gibt es dort vielleicht zwei 'Test'-Objekte? eins wird geändert, ein anderes geprüft (dort keine Änderung)
Ich habe mir den Code nur oberflächlich angeschaut, aber zumindest der Zugriff auf test muss synchronisert werden, z.B. mit volatile.... das ist ein alter Hut, hundert mal hier im Forum breitgetreten.
Ach ja, auf das Ergebnis solltest du natürlich auch im Thread reagieren...
Falls du meinen code meinst - den musst du nicht kritisieren ;-) der ist nur als Denkanstoss gedacht und alles andere als perfekt. Er beweist nur in abgespeckter Form ohne jeglichen overhead, dass der ursprüngliche Code läuft.
Hier geht es übrigens nicht um das Thema "synchronisation" sondern um den Zugriff auf Variablen in einem anderen Kontext.
So nebenbei: Der Hinweis "ist im forum schon x mal-.... " ohne KONKRETEN Link WO das behandelt wurde nervt das höchstens, mindestens ich konnte der Forumssuche eigentlich noch nie ein vernünftiges Resultat entlocken. Und ausserdem ist auf dem Nivau "Anfänger" wohl jedes Thema schon mal behandelt worden ;-)
Falls du meinen code meinst - den musst du nicht kritisieren der ist nur als Denkanstoss gedacht und alles andere als perfekt. Er beweist nur in abgespeckter Form ohne jeglichen overhead, dass der ursprüngliche Code läuft.
Er meint wohl den des TS, deinen vielleicht auch, denn der hat denselben Bug, soviel zum Thema "läuft"..
Falschen Code einstellen war wohl ein versehen? Dann wird der Hinweis doch wohl erlaubt sein.
Hier geht es übrigens nicht um das Thema "synchronisation" sondern um den Zugriff auf Variablen in einem anderen Kontext.
So nebenbei: Der Hinweis "ist im forum schon x mal-.... " ohne KONKRETEN Link WO das behandelt wurde nervt das höchstens, mindestens ich konnte der Forumssuche eigentlich noch nie ein vernünftiges Resultat entlocken. Und ausserdem ist auf dem Nivau "Anfänger" wohl jedes Thema schon mal behandelt worden
Trotzdem wird er Hinweis erlaubt sien, das ist auch kein Grund jedem alles von vorne vorzukauen, weil jemand keine Lust/Ahnung von der Suchfunktion hat
Falls du meinen code meinst - den musst du nicht kritisieren ;-) der ist nur als Denkanstoss gedacht und alles andere als perfekt. Er beweist nur in abgespeckter Form ohne jeglichen overhead, dass der ursprüngliche Code läuft.
Wenn du Code als Beispiel postest, sollte er korrekt sein. In deinem Fall läuft er zufällig. Der threadübergreifende Zugriff auf gemeinsam benutze Werte muss synchronsiert werden, z.B. mit volatile oder einem synchronized-Block. Wer das nicht weiß hat jetzt genügend Informationen um die Forensuche oder Google zu befragen, warum das so ist.
So nebenbei: Der Hinweis "ist im forum schon x mal-.... " ohne KONKRETEN Link WO das behandelt wurde nervt das höchstens, mindestens ich konnte der Forumssuche eigentlich noch nie ein vernünftiges Resultat entlocken. Und ausserdem ist auf dem Nivau "Anfänger" wohl jedes Thema schon mal behandelt worden ;-)
hihi der Code läuft nicht nur zufällig - der Code läuft ganz sicher, nur ist das Resultat nicht immer das selbe. Aber er beweist, dass das Problem des TO gar keines ist ;-)
Das hier ist das Anfänger-Forum - also immer schön einfach bleiben mit den Antworten ;-) - das ist der Grund warum ich mich gar nicht erst darum gekümmert habe mit welchen Mechanismen man das bei Java hinkriegt.
Ansonsten ist mein Code open source und darf verändert werden - also wenn du eine Synchronisation einbauen willst, bitte ;-)
Trotzdem wird er Hinweis erlaubt sein, das ist auch kein Grund jedem alles von vorne vorzukauen, weil jemand keine Lust/Ahnung von der Suchfunktion hat
Ist das ein Antrag das Anfängerforum zu schliessen ???:L
Wenn ab heute bis Ende Jahr auch nur ein Anfängerthema auftaucht, für das über Suchmaschinen keine Lösung gefunden wird und somit deiner Meinung nach überflüssig ist, spendiere ich dir eine Flasche Prosecco zum Silvester :lol:
Ist das ein Antrag das Anfängerforum zu schliessen ???:L
Wenn ab heute bis Ende Jahr auch nur ein Anfängerthema auftaucht, für das über Suchmaschinen keine Lösung gefunden wird und somit deiner Meinung nach überflüssig ist, spendiere ich dir eine Flasche Prosecco zum Silvester :lol:
Threading ist kein Anfängerthema, auch wenn der Poster es hier eingestellt hat. Sogar Stammbenutzer haben damit Probleme.
Ich mag keinen Prosecco, ich nehme ein Bier. Die Themen sind oft überflüssig, damit muss man einfach leben.
Leider verwechseln viele "Anfänger" mit "faul"... aber auch diese Diskussion führt zu nichts und hatten wir schon öfter...