Auktionsspiel - cmd

strußi

Top Contributor
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)

Java:
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
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Um wait und notify aufrufen zu können musst der aufrufende Thread auf dieses Objekt synchronisiert sein.
Also statt
Java:
wait(1000);

Java:
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

Top Contributor
@gucky: danke. ich nutze jetzt die sleep()-Methode, nun ist aus dem toten typ ein besoffener geworden, der macht was er will ;-(
Java:
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
 

strußi

Top Contributor
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?
 
Zuletzt bearbeitet:

Major_Sauce

Bekanntes Mitglied
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 :D

Java:
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
 

Neue Themen


Oben