Addieren mit Runnables

aichasteffi

Mitglied
Hallo Zusammen,
Ich arbeite an dieser Aufgabe und verstehe nicht was man bei den Methoden addValue und getValue sowie getSum in den Körper schreiben muss, dass das richtige rauskommt.
:
In dieser Aufgabe sollen Sie die Summe von Zahlen berechnen. Das Berechnen soll in dieser Aufgabe jedoch neu in verschiedenen Threads erfolgen. Es soll für jeden Summand ein eigenes Objekt erstellt werden, welches das Interface Runnable implementiert. Durch das Ausführen aller Objekte in separaten Threads soll die Summe in einer Klassen-Variable berechnet werden.

Schreiben Sie dazu eine Klasse MyRunnable welche von Runnable abgeleitet ist. Ihre Klasse soll eine Objekt-Variable und eine Klassen-Variable besitzen, eine für den Wert des Summand und eine für die Summe, beide vom Typ int. Die Objekt-Variable soll mit einer Methode getValue ausgelesen werden können, die Klassen-Variable mit einer Methode getSum. Der Konstruktor soll einen Parameter vom Typ int haben und den Wert der Objekt-Variablen zuweisen.

Die parameterlose Objekt-Funktion run soll eine Klassen-Funktion addValue mit der Objekt-Variablen als Parameter aufrufen. In der Klassen-Funktion addValue soll dann zur Summe, welche in der Klassen-Variable gespeichert ist, der Wert hinzu addiert werden.

Wenn nun im Test-Programm mehere Objekte vom Typ MyRunnable erstellt werden und diese verschiedenen Threads übergeben werden, wird so gut wie nie die korrekte Summe berechnet. Weshalb ist dies der Fall? Lösen Sie das Problem durch Synchronisation an der richtigen Stelle.

Code:
public class MyRunnable implements Runnable{
  //static int getSum(); // Klassenvariable

    //double getValue();     // Objektvariable

  int a;
  int b;
 
    public void add(int a, int b){
        this.a = a;
        this.b = b;
    }
    public void run() {
        addValue(a,b);
    }
   
public void addValue(int a, int b){
    int sum=0;
    for(int i=a;i<=b;i++){
        sum = sum + i;
    }

  }

}
 

mrBrown

Super-Moderator
Mitarbeiter
Du hast doch in deinem Code nichts von dem gemacht, was in der Aufgabe steht...

Ihre Klasse soll eine Objekt-Variable und eine Klassen-Variable besitzen, eine für den Wert des Summand und eine für die Summe, beide vom Typ int.
Du bräuchtest erstmal diese beiden Variablen (falls a und b dies sein sollen: Denkbar schlechter Name).

Die Objekt-Variable soll mit einer Methode getValue ausgelesen werden können, die Klassen-Variable mit einer Methode getSum.
Diese beiden Methoden machen nichts anderes, als den Wert zurückgeben - die passende Signatur für zweitere hast du bereits, wenn auch auskommentiert, bei der ersten müsst du den Rückgabetyp anpassen. Beide müssen dann nicht mehr machen, als den Wert der jeweiligen Variable zurückzugeben.

Der Konstruktor soll einen Parameter vom Typ int haben und den Wert der Objekt-Variablen zuweisen.
Den Konstruktor müsstest du einfach hinzufügen, die Beschreibung ist denkbar eindeutig.

Die parameterlose Objekt-Funktion run soll eine Klassen-Funktion addValue mit der Objekt-Variablen als Parameter aufrufen.
Die Funktion addValue soll sowohl statisch sein, als auch nur einen Parameter haben - beides hast du bisher noch nicht beachtet - diese muss dann mit der Variable aus dem ersten Schritt aufgerufen werden, nicht mit zweien.
In der Klassen-Funktion addValue soll dann zur Summe, welche in der Klassen-Variable gespeichert ist, der Wert hinzu addiert werden.
Außerdem soll nur der übergebene Wert hinzuaddiert werden - du lässt umständlicherweise eine Schleife laufen und addierst mehrere Werte.
 

aichasteffi

Mitglied
Code:
public class MyRunnable implements Runnable{
 
   int summand;
  int summe;
 
  double getSum(){
return(summand);} // Klassenvariable

double getValue(){
return summe;}     // Objektvariable

  public MyRunnable(){
    System.out.println(summe);
  }
 
    public void add(int summand, int summe){
        this.summand = summand;
        this.summe = summe;
    }
    public void run() {
       addValue(summe);
    }
   
static int addValue(int summand, int summe){
    int sum=0;
    for(int i=summand;i<=summe;i++){
        sum = sum + i;
    }

  }

}

Vielen Dank für die Tipps, ich habe ein paar Dinge verändert, allerdings hab ich nicht verstanden was mit dem addieren am Schluss anders sein sollte.
In der Klassen-Funktion addValue soll dann zur Summe, welche in der Klassen-Variable gespeichert ist, der Wert hinzu addiert werden.
 

mrBrown

Super-Moderator
Mitarbeiter
Vielen Dank für die Tipps, ich habe ein paar Dinge verändert
DU hast allerdings die wenigsten Dinge so verändert, dass sie zur Aufgabenstellung passen...


Du hast immer noch keine Klassenvariable (Mit dem nebenstehendem Kommentar wird es nicht zu einer!)

getSum und getValue geben immer noch beide double zurück, und nicht int.

Der Konstruktor nimmt immer noch keinen Parameter entgegen, sondern gibt stattdessen irgendwas auf der Konsole aus.

addValue hat immer noch zwei Parameter, und nicht wie gefordert einen.
Außerdem hast du zusätzlich noch die (überflüssige) Methode add.


allerdings hab ich nicht verstanden was mit dem addieren am Schluss anders sein sollte.

Die Methode soll ein Argument übergeben bekommen. Dieses soll zu der Klassenvariable addiert werden, sodass der neue Wert der Klassenvariable der alten Wert plus das Argument ist.


Du legst eine neue Variable sum an, und addierst zu dieser alle Werte zischen den zwei Argumenten summe und summand auf. Den berechneten Wert ignorierst du danach, die Klassenvariable änderst du nicht.


Klingt zwar hart, aber ich würde dir raten, alles bisherige wegzuschmeißen, und mit der Aufgabe noch mal von vor zu beginnen und dabei die Aufgabenstellung Schritt für Schritt abzuarbeiten.
 

Neue Themen


Oben