Zwei Threads greifen auf eine Methode einer Klasse zu. Komplikationen?

Status
Nicht offen für weitere Antworten.

mci

Mitglied
Hallo zusammen,

ich bin mir nicht sicher, ob ich die Threads so richtig verstehe. Ich habe drei Klassen (Main, Prog1 extends Thread, Prog2 extends Thread), wobei die zwei Klassen (Prog1, Prog2) als Threads von der Main Klasse aufgerufen werden.

Nun habe ich Methoden in der Main Klasse, die von den beiden anderen Threads aufgerufen werden. Es kann unter Umständen auch passieren, dass die Threads eine Methode der Main Klasse gleichzeitig aufrufen müssen.

Die Methoden der Main Klasse werden ja über Objekte angesprochen. Nun zu meiner Frage... Wenn ich die Klassen Prog1 und Prog2 zwei verschieden Objekte der Klasse Main verwenden lasse, kann es da trotzdem zu Kollisionen kommen? Was wäre eurer Meinung nach die beste Lösung?

Hier das Beispiel optisch verdeutlicht:

Java:
public class Main {
     public static void main(String[] args) {
          Prog1 prog1 = new Prog1();
          prog1.start();
          Prog2 prog2 = new Prog2();
          prog2.start();
     }
     public static int rechner(int zahl1, int zahl2) {
          return (zahl1 * zahl2);
     }
}
public class Prog1 extends Thread{
     Main main1 = new Main();
     System.out.println(main1.rechner(1, 2));
}
public class Prog2 extends Thread{
     Main main2 = new Main();
     System.out.println(mein2.rechner(4, 5));
}

Was würde passieren, wenn die Threads parallel (gleichzeitig) laufen würden?

Ich hoffe ihr versteht mein Anliegen. Vielen Dank im Voraus,
lg mci
 

@x.l

Bekanntes Mitglied
Such mal nach synchronized.

BTW: Warum erzeugst du dir ein Objekt vom Typ main, wenn die rechnen-Methode static ist?
 
S

Spacerat

Gast
In diesem Fall passiert wohl gar nichts bis auf das erwartete. Problematisch wirds erst, wenn zwei Threads gleichzeitig eine Methode der selben Instanz eines Objekts aufrufen, die Instanzvariablen verändern.
Im Übrigen: Du brauchst Main nicht zu instanzieren, um dessen statische Methode [c]rechner()[/c] aufzurufen.
@Edit: Und wieder mal... Gäääähhhnnn ...zu langsam ;(
 

hdi

Top Contributor
Wenn ich die Klassen Prog1 und Prog2 zwei verschieden Objekte der Klasse Main verwenden lasse, kann es da trotzdem zu Kollisionen kommen?

Nein. Aber das tust du hier nicht. Du verwendest eine statische Methode, die ist nicht an Objekte gebunden, sprich es könnte weiterhin zu Komplikationen kommen. Aber auch das ist hier nicht der Fall ;)

Eine Voraussetzung solcher sog. "Race Conditions" ist nämlichunter anderem, dass die gleichen Resourcen verwendet werden. Die Threads manipulieren nichts, was von beiden genutzt wird. Du rechnest nur mit den lokalen Variablen, die du der Methode mitgibst. Thread 1 und Thread 2 haben somit nix miteinander zu tun. Das ist unabhängig davon ob die Methode statisch ist oder nicht. Aber der Unterschied sollte dir trotzdem klar sein.
 
S

SlaterB

Gast
Zusatz-Infos:
bei verschiedenen Objekten (main1, main2) könnte es auch bei den jeweils eigenen nicht-statischen Klassenattributen nicht zu Konflikten kommen

Methoden, die überhaupt nicht auf Klassenattribute zugreifen, wie rechner(), können sich auch nicht gegenseitig stören
 

hdi

Top Contributor
Genau, hier nochmal was zum Lesen, woran man auch erkennt warum es eben eine Bedingung ist, dass die Threads sich mindestens 1 Resource (=Objekt/primitver Typ) teilen müssen:

Race Condition ? Wikipedia

(Was die dort als "System" bezeichnen sind Threads)
 

mci

Mitglied
Vielen Dank für die ausführlichen und schnellen Antworten! :)

In diese Thematik werde ich mich noch genauer einlesen müssen. Ich werde einmal mein Programm aktualisieren, static aus dem Methoden Kopf entfernen und die Methoden auch wirklich als Objekte aufrufen.

Auf jeden Fall, vielen Dank für eure Hilfe. Sobald ich irgendwo ins Stocken komme, melde ich mich.

lg mci
 

mci

Mitglied
Hallo,

ich hätte noch eine Frage. Was passiert, wenn zwei verschiedene Objekte (main1 und main2) auf ein und dasselbe Objekt (zus) zugreifen? Ist es dasselbe Objekt? Oder bekommt main1 sowie main2 ihr eigenes Objekt mit dem Namen zus? Ich hoffe ihr versteht, was ich meine.

Java:
public class Main {
     public static zahl1 = 0;
     public static void main(String[] args) {
          Prog1 prog1 = new Prog1();
          prog1.start();
          Prog2 prog2 = new Prog2();
          prog2.start();
     }
     public int rechner(int add_zahl) {
          Zusatzklasse zus = new Zusatzklasse();
          zus.zusatzmethode();
          zahl1 += add_zahl
          return zahl1;
     }
}
public class Zusatzklasse{
     public void zusatzmethode(){
          blabla
     }
}
public class Prog1 extends Thread{
     public void run(){
          Main main1 = new Main();
          System.out.println(main1.rechner(1));
     }
}
public class Prog2 extends Thread{
     public void run(){
          Main main2 = new Main();
          System.out.println(mein2.rechner(4));
     }
}

Vielen Dank im voraus,
lg mci
 
S

SlaterB

Gast
ob es ein oder zwei Zusatzklasse-Objekte sind, das fragst du wirklich?
in Ruhe nachdenken bringt nix?
 

mci

Mitglied
Hallo SlaterB,

danke für die schnelle Antwort.

Also, mit dem ruhig nachdenken, ist es so eine Sache... Für mich würde irgendwie beides logisch sein. Wenn ein Objekt (main1), ein anderes erzeugt (zus), gehört es dann nicht main1?

Auf der anderen Seite könnte ich in den Klassen prog1 und prog2 eigene zus-Objekte erstellen und diese der Methode rechner() mitgeben, oder? Das wäre auch eine Lösung?

Du siehst, mir mangelt es hier etwas am Verständnis und nicht an der Faulheit um nachzudenken... :D

lg mci
 
S

Spacerat

Gast
Solange "blabla" nicht irgendwas mit "zahl1" in Main macht ist die Zusatzklasse sammt Methode für Race-Conditions uninteressant. Was nun aber interessant ist, ist die Tatsache, das z.B. 1 + 1 hier durchaus auch mal 5 ergeben können, weil rechne nicht synchronisiert ist.
 
S

SlaterB

Gast
was zu den zus-Objekten geschrieben wurde habe ich immer noch nicht genau verstanden,
jedenfalls sind lokale Objekte immer verschieden,
selbst wenn zwei Threads gleichzeitig rechner() an ein und demselben Main-Objekt aufrufen würden,
wären es zwei verschiedene Methoden-Ausführungen mit eigenen lokalen Variablen
 

hdi

Top Contributor
Um das nochmal hervorzuheben:

Wenn ein Objekt (main1), ein anderes erzeugt (zus), gehört es dann nicht main1?

Das heisst nur, dass es eben ein Objekt erzeugt hat. Nicht mehr und nicht weniger. D.h. es liegt irgendwo im Speicher, aber die haben weiter keine Beziehung zu einander, es sei denn diese Beziehung ist in der Klasse festgelegt, d.h. "zus" machst du zu einer globalen Klassenvariable der Klasse Main, so wie es "zahl1" ist.
Dann wäre der Zugriff von beiden Threads auf die zusatzMethode() nicht synchronisiert, weil sie auf dem gleichen ZustatzObjekt arbeiten. Aber in deinem Fall ist das eben keine Instanzvariable der Klasse, sondern nur ein lokales Objekt, und jeder Thread erzeugt ein eigenes, und arbeitet dann damit.

Wenn jetzt allerdings die zusatzMethode() den Wert von "zahl1" ändern würde, gäbe es wieder Probleme. Aber nicht wegen des Zusatzobjektes. Da hat jeder Thread sein eigenes. D.h. es würde dir nix bringen, die zusatzMethode() zu synchronisieren!
 
S

Spacerat

Gast
@SlaterB: ...aber dir ist doch wohl aufgefallen, das "zahl1" public static ist, und damit eigentlich von überall zu jeder Zeit verändert werden kann, also auch vom Zusatz-Objekt. Für rechner() ist es tatsächlich egal, in welcher Instanz sie aufgerufen wird, an der Tatsache, das eine Klassen-Variable verändert wird, ändert das nichts.
 

depood

Mitglied
Wenn du herumtesten willst.. hab noch ein codesnipe womit ich selber gelernt hab,

Java:
/**
 *
 * @author Daniel
 */
public class ThreadJobs implements Runnable {

   /* Es gibt nur EINE Instanz des ThreadJobs d.h nur
    * EINE Instanz des Bankkontos. Beide Thrads werden
    * auf dieses eine Konto zugreifen.
    */
    private BankAccount account = new BankAccount();

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

       /* Instantiieren Sie das Runnable (den job) */
        ThreadJobs jobs = new ThreadJobs();

       /* Machen Sie zwei Threads und übergeben SIe beiden den gleichen
        * Runnable-Job. Das bedeutet, dass beide Threads auf ein und dieselbe
        * Instanzvariable account in der Runnable Klasse zugreifen.
        */
        Thread threadOne = new Thread(jobs);
        Thread threadTwo = new Thread(jobs);

        // den Threads einen Namen geben
        threadOne.setName("Rainer");
        threadTwo.setName("Monika");

        threadOne.start();
        threadTwo.start();

    }
    /* In der run() Methode durchläuft ein Thread die Schleife und versucht
     * bei jeder Iteration, eine Abhebung zu machen. Nach dem Abgeben prüft
     * er den Kontostand erneut, um zu sehen, pb das Konto überzogen ist*/
    public void run() {
        for (int x = 0; x < 10; x++) {
            drawMoney(10);
            if(account.getBalance() < 0) {
                System.out.println("Amount overdraw!");
            }
        }
    }

    private void drawMoney(int value) {
       /* Prüfen Sie den Kontostand, und wenn nicht genug Geld da ist, wird einfach eine Melung
        * ausgegeben. WENN genug da ist, schlafen wir ein, wachen danach wieder auf und führen die
        * Abhebung zu Ende.
        */

        if (account.getBalance() >= value) {
            System.out.println(Thread.currentThread().getName() + " ist im Begriff abzuheben.");
            try {
                System.out.println(Thread.currentThread().getName() + " schläft ein.");
                Thread.sleep(500);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " ist aufgewacht.");
            account.debit(value);
            System.out.println(Thread.currentThread().getName() + " führt die Abhebung zu Ende.");
        } else {
            System.out.println("Leider nicht genug geld für " + Thread.currentThread().getName());
        }
    }
}

gibt noch ein weiteres thread problem, wenn du nicht nur 2 threads in eine methode schickst, sondern 2 threads und 2 synchronized objekte hast..

um das problem zu lösen -> Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 11.5 Synchronisation über kritische Abschnitte




(nur der Vollständigkeit halber)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
L Mehr als zwei Threads synchronisieren Java Basics - Anfänger-Themen 7
Torschti Eingabe von Dezimalzahlen (bis zu zwei Kommastellen) Java Basics - Anfänger-Themen 11
A 1 Leerzeichen durch zwei Leerzeichen ersetzen Java Basics - Anfänger-Themen 4
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
sasnitzer java augensumme von zwei würfeln ist 1 Java Basics - Anfänger-Themen 8
krgewb Double mit zwei Nachkommastellen Java Basics - Anfänger-Themen 2
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
D Größtes Palindrom Produkt aus zwei dreistelligen Zahlen Java Basics - Anfänger-Themen 60
berserkerdq2 Habe zwei exceptions, welche ist ein Kommunikationsfehler und welche ein Ausgabefehler? Java Basics - Anfänger-Themen 4
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
B Erste Schritte Bisektion mit zwei Funktionen? Java Basics - Anfänger-Themen 1
G zwei Instanzen einer Klasse Java Basics - Anfänger-Themen 29
A Java-XSSFBook: zwei Sheets mergen Java Basics - Anfänger-Themen 5
C Zwei Arrays addieren und ausgeben Java Basics - Anfänger-Themen 3
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
D Zwei verschiedene Intellij Projekte, wie benutze ich wechselseitig objekte Java Basics - Anfänger-Themen 8
berserkerdq2 Wie würde man einen regulären Ausdruck in Java schreiben, der prüft, dass zwei bestimtme Zahlen nicht nebeneinadner sind? Java Basics - Anfänger-Themen 3
K mit <<1 kann man mal 2 machen, mit >>2 geteilt durch zwei und was bewirkt <<<1 und >>>1? Java Basics - Anfänger-Themen 5
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
F Abstand zwischen zwei Objekten berechnen wie? Java Basics - Anfänger-Themen 1
M Wie kann ich ein Array in zwei Hälften aufteilen? Java Basics - Anfänger-Themen 12
S Längster Pfad zwischen zwei Vertices in einem Graph Java Basics - Anfänger-Themen 3
S Aktuell beste Methode um zwei Bilder zu vergleichen..? Java Basics - Anfänger-Themen 1
A Zwei XML-Dateien Mergen Java Basics - Anfänger-Themen 14
U Erste Schritte nextGaussian zwischen zwei Werten Java Basics - Anfänger-Themen 19
S Multiplikation von zwei Labels Java Basics - Anfänger-Themen 7
U zwei 2D arrays auf gleich sein überprüfen Java Basics - Anfänger-Themen 14
Bademeister007 Elemente aus zwei verschiedenen Arrays miteinander vergleichen und gegeben falls entfernen Java Basics - Anfänger-Themen 14
Düsseldorf2002 Datentypen Zwei dimensionale LinkedList Java Basics - Anfänger-Themen 8
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
J Zwei Objekte vergleichen Java Basics - Anfänger-Themen 8
X Zwei Dimensionales Array prüfen Java Basics - Anfänger-Themen 1
G Methoden Informationen aus zwei Objekte bekommen? Java Basics - Anfänger-Themen 6
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
pkm Regexproblem - Wie kann ich zwei oder mehr beliebige Zeichen matchen? Java Basics - Anfänger-Themen 7
A Wieso bekomme ich hier zwei unterschiedliche Ausgaben? Java Basics - Anfänger-Themen 6
H Ein gegebenes Int Array zu Zwei Arrays zurück geben Java Basics - Anfänger-Themen 6
J zwei String Arrays miteinander vergleichen Java Basics - Anfänger-Themen 18
R Methode zwei Sortierkriterien der Klasse Comparator übergeben Java Basics - Anfänger-Themen 4
B Collections.sort mit zwei Bedingungen? Java Basics - Anfänger-Themen 4
X Textdatei: zwei-zeilenweise gleiche Zeilen rausschmeißen Java Basics - Anfänger-Themen 21
M Konkatenation von zwei Strings Java Basics - Anfänger-Themen 6
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
D Input/Output Input von zwei Koordinaten validieren und anschließend Werte speichern Java Basics - Anfänger-Themen 7
L Zwei sortierte Subarrays mit gleicher Länge zusammenfügen Java Basics - Anfänger-Themen 2
F Zwei Dimensionles Array Java Basics - Anfänger-Themen 21
I Alle Elemente von zwei Listen vergleichen Java Basics - Anfänger-Themen 1
J Inhalte von zwei Arrays vertauschen?! Java Basics - Anfänger-Themen 6
O zwei Arrays nach Werten durchsuchen und zusammenfügen Java Basics - Anfänger-Themen 3
A Wie zwei zahlen in einer Variable speichern? Java Basics - Anfänger-Themen 7
N Zwei Daten (Datum) miteinander vergleichen, abspeichern, laden Java Basics - Anfänger-Themen 4
B Relativen Anteil von zwei Datümer auf Monatsebene umrechnen Java Basics - Anfänger-Themen 130
W Zwei Programme sollen auf eine Klasse zugreifen Java Basics - Anfänger-Themen 18
B Rückgabe von zwei Werten: String und double Java Basics - Anfänger-Themen 14
J Zwei Klassen die sich gegenseitig referenzieren - Bad practice? Java Basics - Anfänger-Themen 4
B Anzahl von Stunden / Tage von zwei Datumswerten ermitteln Java Basics - Anfänger-Themen 1
L Erste Schritte Elemente zwei Schlangen vergleichen Java Basics - Anfänger-Themen 14
N Zwei Strings mit "==" vergleichen warum TRUE Java Basics - Anfänger-Themen 2
D Input/Output InputDialog mit zwei Inputfeldern? Java Basics - Anfänger-Themen 4
D Funktion zwei Arraylisten zu verleichen ob gleich funktioniert nicht Java Basics - Anfänger-Themen 26
S Daten aus zwei Verschiedenen Tabellen in eine ArrayListe Java Basics - Anfänger-Themen 4
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
J Logging erzeugt zwei dateien.... Java Basics - Anfänger-Themen 7
S zwei-dimensionales Array Java Basics - Anfänger-Themen 20
R Zwei Attribute gleichzeitig ausgeben Java Basics - Anfänger-Themen 12
T Classpath Zwei gleiche Dateinamen in verschiedenen Projekten möglich? Java Basics - Anfänger-Themen 13
H Bubblesort-Zwei Integer auf Dekade vergleichen. Java Basics - Anfänger-Themen 6
M Wie erzeuge ich die Differenz von zwei Daten in Stunden?? Java Basics - Anfänger-Themen 2
L Den Winkel zwischen zwei Vektoren berechnen! Java Basics - Anfänger-Themen 2
jaleda100 KeyCode – zwei Tasten gleichzeitig Java Basics - Anfänger-Themen 2
M Methoden Zwei Methoden in einem Program laufen lassen...aber wie? Java Basics - Anfänger-Themen 2
M Methoden zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M For-Schleife durch zwei versch. Variablen begrenzen Java Basics - Anfänger-Themen 27
B Erste Schritte Problem bei der Verknüpfung von zwei klassen Java Basics - Anfänger-Themen 8
J Methoden Zwei Methoden die fast das gleiche tun organisieren Java Basics - Anfänger-Themen 3
Bluedaishi der Monat zwischen zwei Datumsangaben Java Basics - Anfänger-Themen 15
J Best Practice Datum Differenz aus zwei Strings ermitteln Java Basics - Anfänger-Themen 8
J Ein Objekt and eine Methode übergeben zwei Schreibweisen? Java Basics - Anfänger-Themen 6
R Threads Pause zwischen zwei Schleifen Java Basics - Anfänger-Themen 1
Aprendiendo Zwei Fragen und ein geerbtes "protected"-Attribut Java Basics - Anfänger-Themen 2
S Parameterübergabe zwischen zwei Programme Java Basics - Anfänger-Themen 4
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
L Classpath Zwei Bibliotheken enthalten gleiche .class Datei Java Basics - Anfänger-Themen 6
S OOP Zwei JSlider in einer Klasse Java Basics - Anfänger-Themen 2
P Aus einem Array zwei Arrays machen Java Basics - Anfänger-Themen 3
ArkHeat Erste Schritte Zwei 2-dimensionale Matritzen addieren Java Basics - Anfänger-Themen 0
S Erste Schritte Zwischen zwei Punkten ein Minimumpkt./Maxima finden Java Basics - Anfänger-Themen 1
T OOP Zwei Klassen Testen (Arrary Iterieren) Java Basics - Anfänger-Themen 6
E Eine Instanzvariable und zwei Objekte Java Basics - Anfänger-Themen 14
S Durchschnitt berechnen aus zwei Textfeldern Java Basics - Anfänger-Themen 21
K Zwei Fragen zu Graphics/Graphics2D Java Basics - Anfänger-Themen 5
P Verbindung von Zwei Kreisen löschen ! Java Basics - Anfänger-Themen 6
J Zwei String-Variabeln vergleichen Java Basics - Anfänger-Themen 5
F Vererbung in zwei Richtungen? Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben