# Roundbased - Thread anhalten



## manuche (20. Jan 2008)

Ich programmiere grade ein rundenbasierendes und netzwerkfähiges Spiel.
Im Hintergrund läuft der Serverthread! Wenn man auf diesen Server connectet wird der Thread  bei der Methoder server.accept() ja solange angehalten, bis ein Client connectet... Nun würde ich gerne den Thread so lange anhalten, bis der Anwender auf den Button "Runde beenden" klickt! 
Die Frage ist nur wie man sowas implementiert! Gibt es Methoden die sowas bereitstellen, oder ist sowas nur mit ner Endlosschleife, die in regelmäßigen Abständen den Buttonstatus abfragt zu realisieren?
Gruß manuche


----------



## SlaterB (20. Jan 2008)

'Nun würde ich gerne den Thread so lange anhalten'
gehts auch genauer? davor hast du von einem Thread geredet der auf Clients wartet, also praktisch schon angehalten ist,
willst du den anhalten oder wen anders?

bezieht sich das Anhalten darauf, dass nicht mehr auf Clients gewartet wird, doch noch, was anderes nicht oder bin ich ganz verrückt?

das server.accept() kannst du jedenfalls nicht unterbrechen, 
da ist das Setzen eines Timeouts nötig, was wohl gehen soll


----------



## masta // thomas (20. Jan 2008)

Ich checks auch nicht  ???:L


----------



## manuche (21. Jan 2008)

Sorry für die Ausdrucksweise... xD
Also das server.accept() war nen Beispiel! Genau den Effekt, den diese Methode hat (Thread blockieren, bis ein Ereignis eintritt) würde ich gerne selber erezugen! Bei server.accept() wartet der Serverthread bis ein Client connectet und in meinem Fall soll der Serverthread warten, bis der Anwender seinen Spielzug beendet und auf seinen Button geklickt hat...
Hoffe das war verständlicher....


----------



## SlaterB (21. Jan 2008)

ein Thread tut nix wenn man ihn mit Thread.sleep() warten lässt,
wobei man das nicht aktiv von einem anderen Thread aus machen kann,
man setzt ein Flag und der Thread legt sich dann bei nächster Gelegenheit selber schlafen

mit thread.interrupt() kann man ihn aufwecken


```
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        Runnable r = new Runnable()
            {
                public void run()
                {
                    System.out.println("t: gehe schlagen");
                    try
                    {
                        Thread.sleep(1000000);
                    }
                    catch (InterruptedException e)
                    {
                        System.out.println("t: InterruptedException");
                    }
                    System.out.println("t: wache auf");
                }

            };
        Thread t = new Thread(r);
        t.start();
        Thread.sleep(1000);
        System.out.println("main: wecke gleich");
        t.interrupt();
    }
}
```


----------



## manuche (21. Jan 2008)

Ja ok die sleep Methode kenne ich... Zwei Fragen:

- heisst interrupt nicht sowas wie "unterbrechen"? Würde doch eigentlich soviel bedeutet, dass ich den laufenden Thread unterbreche und nicht seine Pause...
- Wenn ich den Thread per Button wieder laufen lassen will komm ich wohl um eine Schleife nicht rum, oder? Dachte da grade so an einen Button mit dem einfach nur ein boolischer Ausdruck geändert wird und dieser boolische Ausdruck dann die Abbruchbedingung der Schleife ist... (In der Schleife dann immerwieder thread.sleep(...))


----------



## SlaterB (21. Jan 2008)

> heisst interrupt nicht sowas wie "unterbrechen"? Würde doch eigentlich soviel bedeutet, dass ich den laufenden Thread unterbreche und nicht seine Pause... 

du machst dir Gedanken, schön, 
bei sowas kommt aber nicht immer das richtige raus 
besser nachlesen

> komm ich wohl um eine Schleife nicht rum, oder? 

das denke ich auch


----------



## manuche (21. Jan 2008)

In der API steht leider auch nur "interrupts the Thread"... -.-


----------



## SlaterB (21. Jan 2008)

nicht dass die API bei so einem Grundlagen-Thema alles erschlagen muss,
aber bisschen mehr steht da schon:



> If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
> 
> If this thread is blocked in an I/O operation upon an interruptible channel then the channel will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException.
> 
> ...


----------

