Aufgabe(Threads) richtig verstanden/implementiert

javac-

Mitglied
Hallo,

ich weiss nicht so recht ob ich folgende Aufgabe richtig verstanden/implementiert habe:

"Schreiben Sie ein Programm, dass mit 100 Threads gleichzeitig bis 100 zählt. Verwenden Sie hierfür die untenstehende Klasse "Counter". Zur Implementierung der Zugriffsbeschränkung auf die gemeinsame Variable nehmen Sie bitte das aus der Vorlesung bekannte Monitor-Konzept(Stichwort synchronized)"

Die Methode „increase()“ soll zusätzlich zu dem Hochzählen der Varibale „count“ den Zählerstand und den Thread, der die Methode aufgerufen hat, ausgeben.
Klasse.jpg


Ich habs folgendermaßen implementiert:

Klasse: Counter
Java:
public class Counter {
   private int count =0;
  
  
   //Methode zum Hochzählen der Variabeln Count, sowie Ausgabe des akt. Threads
   public void increase(){
     this.count++;
     System.out.println(Thread.currentThread().getName() +" "+ this.count);
   }
     
   //Getter,Setter
   public int getCount() {
     return count;
   }

   public void setCount(int count) {
     this.count = count;
   }
   }

ThreadKlasse
Java:
public class ThreadClass extends Thread{
 
   private int end;//Soweit soll der jeweilige Thread hochzählen
   private Counter counter = new Counter();
  
  
   //Konstruktor
   public ThreadClass(int end){
     this.end=end;
   }
  
  
   //Run-Methode
   public void run(){
     hochzählen();
   }

  
   public void hochzählen(){
    
     for(int i=0; i<this.end; i++){
      
       synchronized(this.counter){
         this.counter.increase();
         if(i==this.end-1){
           System.out.println(Thread.currentThread().getName()+" ist fertig");
         }
       }
     }
   }

   //Getter,Setter
   public int getEnd() {
     return end;
   }
   public void setEnd(int end) {
     this.end = end;
   }

Main
Java:
public static void main(String[] args) {
   
     //In einer For-Schleife mit 100 Threads auf 100 zählen
     for(int i=0; i<100; i++){
       ThreadClass t1 = new ThreadClass(100);
       t1.start();
     }    
   }
 

fhoffmann

Top Contributor
Ich verstehe die Aufgabe so, dass du eine (!) Instanz der Klasse Counter erzeugst und 100 Threads erzeugst, die in dieser einen Instanz jeweils einmal (!) increase() aufrufen. Wenn alles gut geht, wurde in der einen Instanz von Counter dann count auf 100 gesetzt. Verantwortlich dafür, dass alles gut geht, ist die Methode increase().
 

Phtevenz

Mitglied
Die Aufgabe sieht aus als könnte sie sehr unterschiedlich ausgelegt werden. Sollst du denn etwas bestimmtes zeigen? Laufzeitmessungen, oder Nicht-Determinismus(unterschiedliche Ausgaben bei mehreren Durchläufen) oder ist es eine Übung zu gegenseitigem Ausschluss bei Threads (mutex etc)?
 

mrBrown

Super-Moderator
Mitarbeiter
Ich versteh's auch als 100 Threads, eine Counter-Instanz (ob jeder Thread 100 hochzählen oder alle zusammen 100 ist für mich nicht ersichtlich...)

Unabhängig von der Aufgabenstellung sollte man aber Thread nicht extenden, sondern runnable implementieren ;)
Außerdem macht synchronized so keinen Sinn, und an überschriebene Methoden gehört @Override.
 

Phtevenz

Mitglied
ja die Frage die jetzt noch zu klären ist, wäre ob die Threads zusammen den counter hochzählen oder ob jeder Thread seinen eigenen counter hat.

So am Rande, warum sollte man Threads nicht extenden sondern als Interface implementieren?
 

mrBrown

Super-Moderator
Mitarbeiter
So am Rande, warum sollte man Threads nicht extenden sondern als Interface implementieren?

Weil implementieren der schönere, sauberere Weg für sowas ist ;) Man will schließlich nicht Thread um Funktionalität erweitern, sondern irgendeinen Thread nur eine Methode ausführen lassen.

Ja interfaces hatten wir. Nein wir haben keine exakte Vorgabe wie wir Threads erstellen müssen. Wie oben schon erwähnt haben wir mit Threads letzten Freitag begonnen und uns wurde es eben so gezeigt - also ...extends Thread
Dann sieh Runnable implementieren als das gelernte anwenden ;)
 

Phtevenz

Mitglied
ok hier haben alle Threads die gleiche Zählvariable (in der Angabe stand was von synchronized, draus schließe ich auch eine gemeinsam genutzte Variable)

Java:
public class MainClass {
    public static void main(String[] args) {
        for (int i=0;i<100;++i){
            IncrementThread t = new IncrementThread(i);
            t.start();
        }
    }

}

Java:
public class IncrementThread extends Thread{
    int id;
    static int counter=0;

    public IncrementThread(int id){
        super();
        this.id=id;
    }

    @Override
    public void run(){
        System.out.println("Hier ist Thread " + this.id);
    }

    synchronized void increase(){
        ++counter;
    }

    synchronized int getCount(){
        return counter;
    }


}

edit: ohne gewähr. ich bin selbst nicht so ganz fit mit der materie. das hochzählen und ausgeben der variable sollte noch implementiert werden
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
public class IncrementThread extends Thread{
    int id;
    static int counter=0;

    public IncrementThread(int id){
        super();
        this.id=id;
    }

    @Override
    public void run(){
        System.out.println("Hier ist Thread " + this.id);
    }

    synchronized void increase(){
        ++counter;
    }

    synchronized int getCount(){
        return counter;
    }


}
Da gibts weder eine gemeinsam genutzte Variable, noch macht synchronized an den Stellen Sinn, die Methoden innerhalb des Threads werden schließlich nur von einem Thread -sich selbst - aufgerufen ;)
 

mrBrown

Super-Moderator
Mitarbeiter
Oh, doch, counter wird gemeinsam benutzt, hab das static übersehen. Würd ich da aber auch nicht benutzen.
In der main bringt es nichts, irgendwas synchronized zu setzten, in dem Object wird ja auch nichts aufgerufen.

In dem Fall des statischen Counters müsste man noch zusätzlich ein Objekt zur Synchronisierung einführen...Deshalb wäre es da Sinnvoller, ein Counter-Objekt wie im Ursprungspost zu verwenden, in diesem kann man dann Methoden mit synchronized kennzeichnen (bzw dieses zum Locken nutzen), dann funktionierts.
 

Phtevenz

Mitglied
Java:
public class IncrementThread implements Runnable{
    int id;
    static Counter c=new Counter();

    public IncrementThread(int id){
        super();
        this.id=id;
    }

    public void run(){

        synchronized (c){
            c.increase();
            System.out.println("Hier Thread " + id + " counter hat den Wert " + c.getCount());
        }

    }

    public static class Counter {
        int count =0;

        void increase(){
            count++;
        }
        int getCount(){
            return count;
        }
    }
}

trifft es das hier besser?
 

javac-

Mitglied
Java:
public class IncrementThread implements Runnable{
    int id;
    static Counter c=new Counter();

    public IncrementThread(int id){
        super();
        this.id=id;
    }

    public void run(){

        synchronized (c){
            c.increase();
            System.out.println("Hier Thread " + id + " counter hat den Wert " + c.getCount());
        }

    }

    public static class Counter {
        int count =0;

        void increase(){
            count++;
        }
        int getCount(){
            return count;
        }
    }
}

Ist der einzige Unterschied beim erstellen eines Threads mit Runnable im Gegensatz zu extends , dass nicht Thread extended wird, sondern Runnable implementiert?
 

Phtevenz

Mitglied
neuer versuch. jetzt haben die threads auch keine id mehr
Java:
public class IncrementThread implements Runnable{
    int id;
    Counter c;

    public IncrementThread(Counter count){
        super();
        this.c = count;
    }
        public void run(){

        synchronized (c){
            System.out.println("Hier Thread " + id + " counter hat den Wert " + c.getCount());
            c.increase();
        }

    }

    public class Counter {
        int count =0;

        protected void increase(){
            count++;
        }
        protected int getCount(){
            return count;
        }
    }
}

Java:
public class MainClass {
    public static void main(String[] args) {
        IncrementThread.Counter c =IncrementThread.new Counter();
        for (int i=0;i<100;++i){
            IncrementThread t = new IncrementThread(c);
            t.run();
        }
    }

}

den Counter erstellen in der Main klappt nicht. Mache ich etwas falsch? "IncrementThread Cannot be resolved to a variable"
 

mrBrown

Super-Moderator
Mitarbeiter
Ist der einzige Unterschied beim erstellen eines Threads mit Runnable im Gegensatz zu extends , dass nicht Thread extended wird, sondern Runnable implementiert?
Ja, und dem Thread übergibt man das Runnable dann.

den Counter erstellen in der Main klappt nicht. Mache ich etwas falsch? "IncrementThread Cannot be resolved to a variable"

Ja, die innere Klasse gehört immer zu einem Objekt, um die so anzusprechen müsse sie static sein. Lager Counter einfach in eine eigene Klasse aus oder mach sie static.
 

Phtevenz

Mitglied
Ja jetzt geht es.

Java:
public class IncrementThread implements Runnable{
    int id;
    Counter c;

    public IncrementThread(Counter count){
        this.c = count;
    }
        public void run(){
            System.out.println("counter an der stelle " + c +"  hat den Wert " + c.getCount());
            c.increase();
    }


}

Java:
public class Counter {
    int count =0;
    public void increase(){
        count++;
    }
    public int getCount(){
        return count;
    }
}

aber hier ist jetzt kein synchronized. das brauche ich anscheinend auch nicht. der counter ist aber laut speicheradresse wirklich bei allen der selbe? ich dachte ohne synchronized block um den counter würden hier seltsame ergebnisse kommen
 

mrBrown

Super-Moderator
Mitarbeiter
Doch, da muss trotzdem synchronized an die passende Stelle. ++ ist keine atomare Operation, 2 Threads könnten gleichzeitig erhöhen, was zu insgesamt einem Increment führen würde
 

Phtevenz

Mitglied
dann sind meine anweisungen insgesamt wohl einfach nur sehr "schnell"?
ich habe jetzt öfter 1000 threads erstellt und konnte nichts ungewöhnliches feststellen.

noch eine andere frage: mache ich durch den synchronized block um den counter nicht das ganze multithreading sinnlos? ich meine da wird ja nichts parallel ausgeführt oder täusche ich mich da
 

Flown

Administrator
Mitarbeiter
mache ich durch den synchronized block um den counter nicht das ganze multithreading sinnlos?
Ja, aber Ziel der Übung ist es zu zeigen, dass der 13. Thread auch den Zähler auf 8 setzen kann, weil er "schneller" an der Reihe war als der der 8. Thread.
ich meine da wird ja nichts parallel ausgeführt oder täusche ich mich da
Doch es wird parallel gezählt, die Threads sollten aber höflich warten, bis sie an der Reihe sind. Versuch doch mal ohne Synchronisation den Endwert zum Schluss auszugeben (musst du eventuell ein paar mal ausführen, damit du den Glitch siehst, da count++ keine atomare Operation ist!)
 

InfectedBytes

Top Contributor
Es passiert halt nicht viel, eben nur eine einfache Inkrementation, daher kann es gut sein, dass dein Thread sofort durchläuft, bevor der nächste überhaupt startklar ist. Daher hast du das Problem bisher noch nicht feststellen können. Aber wenn du es oft genug probierst, wirst du vermutlich irgendwann auch den Problemfall zu sehen bekommen.
Wenn einmal die Komplexität steigt, wird es auch immer wahrscheinlicher, dass sich zwei Threads in die Quere kommen können. Wenn du z.b. eben viel mehr als nur eine einfach Inkrementation machst, wirst du sehr schnell die Probleme sehen
 

Phtevenz

Mitglied
du hast recht. einige zahlen kommen doppelt vor.

gibt es denn atomare operationen irgendeiner art? um solche müssten dann keine synchronized blöcke gesetzt werden stimmt das?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
Jere58 Aufgabe zu Mustern Java Basics - Anfänger-Themen 1
M Interfaces Aufgabe Java Basics - Anfänger-Themen 2
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
Justin4687 Benötige Hilfe bei folgender Aufgabe Java Basics - Anfänger-Themen 2
A Erste Schritte Aufgabe mit while Schleife Java Basics - Anfänger-Themen 11
S Hilfe zu einer Aufgabe Java Basics - Anfänger-Themen 5
M Java Programmierung Aufgabe Anfänger Java Basics - Anfänger-Themen 1
R Hilfe bei Aufgabe Java Basics - Anfänger-Themen 4
Mikejr Java Berg aufgabe Java Basics - Anfänger-Themen 6
frager2345 Aufgabe Hash Objekt Elemente ausgeben Java Basics - Anfänger-Themen 2
berserkerdq2 Habe ich die Aufgabe richtig gelöst? Java Basics - Anfänger-Themen 3
D Hilfe bei einer Aufgabe mit for-Schleife Java Basics - Anfänger-Themen 6
Neuling47 Ich zerbreche mit den kopf an einer Aufgabe Java Basics - Anfänger-Themen 61
G Fragen zu Kompelierfehler in Aufgabe. Java Basics - Anfänger-Themen 25
Robert_Klaus Hamster java Simulation Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
T Informatik Studium Aufgabe Java Basics - Anfänger-Themen 4
T Aufgabe Informatik Studium Java Basics - Anfänger-Themen 10
I matrix aufgabe Java Basics - Anfänger-Themen 22
J Brauche Hilfe bei for-each Aufgabe Java Basics - Anfänger-Themen 1
9 Aufgabe Bruttorechner Java Basics - Anfänger-Themen 14
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
J Brauche Hilfe bei Aufgabe Java Basics - Anfänger-Themen 4
J boolean aufgabe Java Basics - Anfänger-Themen 9
D Snake-Spiel ähnliche Aufgabe Hilfe Java Basics - Anfänger-Themen 3
M Hilfe - Array Aufgabe Java Basics - Anfänger-Themen 8
StevenGG Aufgabe im Studium Java Basics - Anfänger-Themen 36
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
S Schulaufgabe - verstehe leider die Aufgabe nicht Java Basics - Anfänger-Themen 4
Leo0909 Ich brauche Hilfe bei dieser Aufgabe Java Basics - Anfänger-Themen 2
R Eclipse Aufgabe Java Basics - Anfänger-Themen 4
J OOP-Aufgabe Java Basics - Anfänger-Themen 15
Helix19 Informatik Grundkurs (Haus-)Aufgabe Java Basics - Anfänger-Themen 5
P eine kleine Aufgabe mit Audio Java Basics - Anfänger-Themen 1
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
TimoN11 Java spezielle Suchprobleme - Aufgabe Java Basics - Anfänger-Themen 5
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 2
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 9
dieter000 Aufgabe Hilfe Java Basics - Anfänger-Themen 18
jonathanpizza Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
Q Hilfe auf Aufgabe(Matrixmultiplikation) Java Basics - Anfänger-Themen 1
jonathanpizza Hilfe bei der Aufgabe Java Basics - Anfänger-Themen 19
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
C Rechnungen-Aufgabe Java Basics - Anfänger-Themen 18
C Biene-Aufgabe Java Basics - Anfänger-Themen 2
K Algorithmen und Datenstrukturen Programmier Aufgabe Java Basics - Anfänger-Themen 10
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Aufgabe Flussdiagramm, kann jemand checken? Java Basics - Anfänger-Themen 8
B Methoden Ausgeben Aufgabe Java Basics - Anfänger-Themen 15
M Lösung Aufgabe - Java Programmiren lernen für Dummies Java Basics - Anfänger-Themen 11
J Rekursion Klausur Aufgabe Java Basics - Anfänger-Themen 2
J Exception-Aufgabe Java Basics - Anfänger-Themen 8
I Methoden char Array Aufgabe (bitte hierbei um Hilfe) Java Basics - Anfänger-Themen 3
F Aufgabe: Abstand von einem Punkt zu einem anderen Punkt Java Basics - Anfänger-Themen 10
T Aufgabe zum Verschlüsselungsalgorithmus Java Basics - Anfänger-Themen 11
J Erste Schritte Aufgabe Java Basics - Anfänger-Themen 24
T Methoden BinaryTree transformieren Aufgabe Java Basics - Anfänger-Themen 36
J Brauche Hilfe bei einer aufgabe Java Basics - Anfänger-Themen 1
J Hat jemand einen Lösungsansatz für diese Aufgabe? Java Basics - Anfänger-Themen 1
S Sortieralgorithmus - Aufgabe mit Lösungsidee Java Basics - Anfänger-Themen 20
A Aufgabe: Gleitkommazahlen Java Basics - Anfänger-Themen 3
A Java-Programmierungs Aufgabe Java Basics - Anfänger-Themen 2
U Aufgabe zu Kontrollstrukturen Java Basics - Anfänger-Themen 8
G Probleme bei Aufgabe Java Basics - Anfänger-Themen 12
J Aufgabe als Feuertaufe Java Basics - Anfänger-Themen 8
S Unbedingte hilfe bei Java Aufgabe [Schleife / Zinsrechnung] Java Basics - Anfänger-Themen 14
J Hilfe bei Java Aufgabe (Restschuld berechnen) Java Basics - Anfänger-Themen 11
G Ratlosigkeit zur Aufgabe im Anhang (boolean, equals.) Java Basics - Anfänger-Themen 20
S Hilfe bei Java Aufgabe (Schleifen) Java Basics - Anfänger-Themen 25
B Probleme bei einer Aufgabe Java Basics - Anfänger-Themen 19
B BITTE!! Ich brauche dringende Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 17
H aufgabe 4 Java Basics - Anfänger-Themen 297
M Hilfe bei Projektorientierungs-Aufgabe !! Java Basics - Anfänger-Themen 3
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
H java aufgabe Java Basics - Anfänger-Themen 7
E Mathematische Aufgabe: Antwort entspricht nicht der Lösung Java Basics - Anfänger-Themen 5
H was verlangt die aufgabe ? Java Basics - Anfänger-Themen 10
H java aufgabe Java Basics - Anfänger-Themen 68
H java aufgabe Java Basics - Anfänger-Themen 25
H aufgabe java luhn algorithmus Java Basics - Anfänger-Themen 10
R Java Aufgabe (Teilbarkeit) Java Basics - Anfänger-Themen 7
H java aufgabe Java Basics - Anfänger-Themen 44
H java aufgabe Java Basics - Anfänger-Themen 7
H java string aufgabe Java Basics - Anfänger-Themen 10
H array aufgabe Java Basics - Anfänger-Themen 13
D Erste Schritte Lösen dieser Aufgabe, Hilfe! Java Basics - Anfänger-Themen 12
H aufgabe Java Basics - Anfänger-Themen 9
H lösung aufgabe Java Basics - Anfänger-Themen 12
S Hilfe für Aufgabe Java Basics - Anfänger-Themen 4
H java online aufgabe Java Basics - Anfänger-Themen 4
H Array aufgabe Java Basics - Anfänger-Themen 7
H oop aufgabe probe kalusur Java Basics - Anfänger-Themen 11
H oop aufgabe Java Basics - Anfänger-Themen 19
H JAVA AUFGABE Java Basics - Anfänger-Themen 7
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
J Problem bei Aufgabe "Geldstückelung" Java Basics - Anfänger-Themen 5
P Problem bei Java-Aufgabe Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben