简体   繁体   中英

Java do something in X minutes

I'm looking for a way to do something every X minutes.

For example in a game you will be playing then every 3 minutes activate

foo();

but I'm not sure how to do this given that other actions will be going on. Ie, we cannot just wait 3 minutes then do foo() instead the rest of the program must be running and the user can invoke other methods but in the background we have to be counting and getting ready to do foo() when the time is ready.

If anyone can give me a starting point I'd much appreciate it!

You want some manner of separate thread that has a timer in it. A built in structure is the ScheduledExecutorService .

A tutorial on how to use one can be found here

The tutorial is kind of confusing and ugly, so here it is summarized in three steps:

1) Define a thread executor (something that manages your threads)

int x = 1; // However many threads you want
ScheduledExecutorService someScheduler = Executors.newScheduledThreadPool(x); 

2) Create a Runnable class, which contains whatever it is you want to do on a schedule.

public class RunnableClass implements Runnable {
   public void run() {
       // Do some logic here
   }
}

3) Use the executor to run the Runnable class on whatever level of your program you want

Runnable someTask = new RunnableClass(); // From step 2 above
long timeDelay = 3; // You can specify 3 what
someScheduler.schedule(someTask , timeDelay, TimeUnit.MINUTES);

Bryan Davis pointed the solution, but the link provided is not very elegant. here is a short sample:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3); 
// 3 = number of thread in the thread pool

scheduler.scheduleAtFixedRate(new Runnable() 
{
       public void run() 
       { 
           // do something here
       }

}, 20, TimeUnit.SECONDS);

For a single threaded game, you can just check every loop whether it is time to do foo() . For example:

long lastTime;
long timeBetweenFoosInMillis = 3*60*1000; //3 minutes
public void loop(){
    while(true){
        doOtherGameStuff();
        if(isFooTime()){
            foo();
            lastTime = System.currentTimeMillis();
        }
    }
}
private boolean isFooTime(){
    return System.currentTimeMillis() >= lastTime + timeBetweenFoosInMillis;
}

You probably want to use Threads. You can put your foo() function in one and make it sleep and execute every X minutes, and put the rest of the program in other threads so your other functions can keep executing. Here is a good tutorial on how to set up a multi-thread program in java: http://www.oracle.com/technetwork/articles/java/fork-join-422606.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM