# Addieren mit Runnables



## aichasteffi (27. Dez 2017)

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.


```
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 (27. Dez 2017)

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



aichasteffi hat gesagt.:


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



aichasteffi hat gesagt.:


> 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.



aichasteffi hat gesagt.:


> 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.



aichasteffi hat gesagt.:


> 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.


aichasteffi hat gesagt.:


> 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 (28. Dez 2017)

```
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 (28. Dez 2017)

aichasteffi hat gesagt.:


> 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`.




aichasteffi hat gesagt.:


> 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.


----------

