# Auktionsspiel - cmd



## strußi (24. Jun 2015)

moin,

ich programmiere mir gerade ein konsolen-auktionsspiel das über cmd laufen soll. beim testen hänge ich gerade meinen auktionator auf und kann mit der fehlermeldung nichts anfangen.
-auktionator ist ein singelton-Object

Fehlermeldung
Exception in thread "main" java.lang.IllegalMonitorStateException
	at java.lang.Object.wait(Native Method)
	at models.Auctioneer.listen(Auctioneer.java:18) //entspricht zeile 3 im angehängten code
	at play.Test.main(Test.java:16) //aufruf der methode listen()
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)



Spoiler: die Methoden die schuld sind





```
public void listen(){
        try{
            wait( 1000);
            while( scanner.hasNextDouble()){
                raisePrice( 100);
               wait( 1000);
            }
            waitForBitts( 100);
        } catch(InterruptedException ex){
            System.out.println( ex);
        }
    }
    
    public void waitForBitts( double last){
        System.out.println("no one else bidding?");
        String[] calls ={ "once", "twice", "sold!"};
        for( int i = 0; i <3; i++){
            System.out.println( last +" going " +calls[ i]);
            listen();
            if( !calls[ i].equals( "sold") &&scanner.hasNext()){
                if( scanner.nextDouble() >last){
                    raisePrice(last);
                    listen();
                }
            } else{
                sell();
            }
        }
    }
```




Was muss ich ändern, damit mein Auktionator wieder aufwacht und die gebote nach oben treibt, sobald ein bieter einen höheren wert innerhalb einer bestimmten zeitspanne eingibt


----------



## Gucky (25. Jun 2015)

Um wait und notify aufrufen zu können musst der aufrufende Thread auf dieses Objekt synchronisiert sein.
Also statt

```
wait(1000);
```


```
synchronized(this){
   wait(1000);
}
```

wait ist dazu gedacht, dass ein Thread an einem Objekt (auch sich selbst) wartet, bis er aufgeweckt wird. wait(long) ist dazu gedacht, dass ein Thread darauf wartet aufgeweckt zu werden, oder bis de Zeit abgelaufen ist. Beide Methoden sind aber für die Interthreadkommunikation gedacht. Besser geeignet ist Thread.sleep(long). Es funktionieren aber beide Möglichkeiten.
Außerdem hast du bei Thread.sleep() den Overhead des Synchonisierens nicht.


----------



## strußi (25. Jun 2015)

@gucky: danke. ich nutze jetzt die sleep()-Methode, nun ist aus dem toten typ ein besoffener geworden, der macht was er will ;-(


Spoiler: geänderter Code





```
public void listen(){
        currendBit =scanner.nextDouble();
        System.out.println("currend bit " +currendBit);
        try{
            while( scanner.hasNextDouble() &currendBit>scanner.nextDouble()){
               raisePrice( currendBit);
                System.out.println("help");
                sleep(1000);
            }
            waitForBitts( currendBit);
        } catch(InterruptedException ex){
            System.out.println(  ex);
        }
    }
    
    public void waitForBitts( double last){
        System.out.println("no one else bidding?");
        String[] calls ={ "once", "twice", "sold!"};
        for( int i = 0; i <3; i++){
            System.out.println( last +" going " +calls[ i]);
            listen();
            if( !calls[ i].equals( "sold") &scanner.hasNext()){
                if( scanner.nextDouble() >last){
                    raisePrice(last);
                    listen();
                } else{
                    listen();
                }
            } else{
                sell();
            }
        }
    }
```




cmd
first offer?
1 //eingabe
currend bit 1.0
1
no one else bidding?
1.0 going once
1
currend bit 1.0
1
no one else bidding?
1.0 going once
1
currend bit 1.0
1
no one else bidding?
1.0 going once


----------



## Gucky (26. Jun 2015)

Jetzt geht das Debugging los


----------



## strußi (30. Jun 2015)

problem gefunden aber die lösung ist mir ein rätzelheft
scanner.hasNext(); api sagt, kann blockieren wärend es auf einen zu scannenden imput wartet.

gibt es eine andere Lösung um zu prüfen, ob etwas in der cmd eingegeben worden ist?


----------



## Major_Sauce (30. Jun 2015)

ein reader, Google brauch da etwa 0.01 Sekunde um tausende Ergebnisse zu finden...

Aber da ich so lieb bin geb ich dir mal nen Codebeispiel 


```
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

//Achtung, reader.readLine() blockiert so lange, bis etwas reinkommt
Stríng input = reader.readLine();

//Mach irgendwas mit dem Input
System.out.println(input);

//Das ganze kann man auch zu nem durchgehenden Listener umbauen:
while((input = reader.readLine()) != null){
    //Mach was
    System.out.println(input);
}
```

mfg Major


----------



## strußi (30. Jun 2015)

@major: vielen dank. ich hoffe das ich damit weiter komm


----------

