# Methode sleepen während das Spiel weiterläuft



## gw1nner (16. Jul 2014)

Guten Tag,

ich möchte gerne eine Methode einbauen, die jede 20s aktiv wird, seinen job erledigt und dann wieder verschwindet. Der Clou, und das ist auch mein Anliegen, ist das es zwingend notwendig ist, das währenddessen das ganze Spiel noch funktioniert und Spieler aktionen durchführen können.

Ich habe es mit derzeit mit:

//         try {
//           Thread.sleep(1000L);    // 1000L = 1000ms = 1 second
//          }
//          catch (InterruptedException e) {
//          }

versucht zu lösen, jedoch möchte ich ja auch die parallele Nutzung der GUI ermöglichen.
Nach 30min im Web bin ich etwas zerstreut, wie kann man das Problem lösen?

Vielen Dank für eure Antworten.

MfG


----------



## Joose (16. Jul 2014)

Indem du diese Arbeit die alle 20 Sekunden verrichtet werden soll auslagerst in einen eigenen Thread.

Da du wahrscheinlich alles in einem Thread hast blockiert dein 
	
	
	
	





```
sleep
```
 auch jede GUI Aktion (und diese friert ein). 

Stichwörter zu diesem Problem: SwingWorker, EventDispatchThread


----------



## SilverClaw (16. Jul 2014)

Theoretisch müsste eine GUI (zumindest bei Swing) doch ohnehin in ihrem eigenen EventDispatchThread laufen. Und dort kann man wundervoll den (swing.)Timer benutzen, um das zu timen.


----------



## kaoZ (17. Jul 2014)

man sollte Grundsätzlich keine länger andauernden Aktionen im EDT ausführen.....

Erstelle dir ein Runnable welches die von dir gewünschten aktionen beinhaltet, übergibt es einem Thread welcher in einer Schleife läuft und das runnable ausführt, unabhängig vom Swing Thread.

Hier nur ein Beispiel , nicht die schönste Lösung, aber dennoch funktional, gibt alle 2 Sekunden "Hallo Welt aus".


```
public class MyRunnable implements Runnable {

    private boolean running;
    
    public MyRunnable(boolean value) {

        this.running = value;
        
        new Thread(this).start();
    }
    
    @Override
    public void run() {
       
       while(running){
           
           System.out.println("Hallo welt");
           
           try {
               Thread.sleep(2 * 1000);
           } catch (Exception ex) {
               ex.printStackTrace();
           }
       }
    }
    
    public static void main(String[] args) {
        new MyRunnable(true);
    }
}
```

für gewöhnlich könnte man nun einen setter anbieten der dann den status des Threads dementsprechend setzt, und ihn insofern er inaktiv sein sollte und man den status von running auf false setzt per Thread.currentThread().interrupt(); bittet seine arbeit wieder einzustellen.

Du würdest dann einfach über z.B einen Button den status ändern und könntest somit den Thread starten und beenden.

Alternativ ist der schon oben erwähnte Timer / TimerTask eine Option.


```
public class MyRunnable {
    
    Timer timer;
    TimerTask task;
    
    public MyRunnable() {
        
        task = new TimerTask() {
            
            @Override
            public void run() {
                    System.out.println("Hallo Welt");
            }
        };
        
        timer = new Timer();
        
        // task wird sofort, jede sekunde ausgeführt
        
        timer.schedule(task, 0, 1000);
    }

    public static void main(String[] args) {
        new MyRunnable();
    }
}
```


----------

