How to stop execution after a certain time in Java?

后端 未结 4 1466
攒了一身酷
攒了一身酷 2020-11-28 07:01

In the code, the variable timer would specify the duration after which to end the while loop, 60 sec for example.

   while(timer) {
    //run
    //terminate         


        
4条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-11-28 07:08

    If you can't go over your time limit (it's a hard limit) then a thread is your best bet. You can use a loop to terminate the thread once you get to the time threshold. Whatever is going on in that thread at the time can be interrupted, allowing calculations to stop almost instantly. Here is an example:

    Thread t = new Thread(myRunnable); // myRunnable does your calculations
    
    long startTime = System.currentTimeMillis();
    long endTime = startTime + 60000L;
    
    t.start(); // Kick off calculations
    
    while (System.currentTimeMillis() < endTime) {
        // Still within time theshold, wait a little longer
        try {
             Thread.sleep(500L);  // Sleep 1/2 second
        } catch (InterruptedException e) {
             // Someone woke us up during sleep, that's OK
        }
    }
    
    t.interrupt();  // Tell the thread to stop
    t.join();       // Wait for the thread to cleanup and finish
    

    That will give you resolution to about 1/2 second. By polling more often in the while loop, you can get that down.

    Your runnable's run would look something like this:

    public void run() {
        while (true) {
            try {
                // Long running work
                calculateMassOfUniverse();
            } catch (InterruptedException e) {
                // We were signaled, clean things up
                cleanupStuff();
                break;           // Leave the loop, thread will exit
        }
    }
    

    Update based on Dmitri's answer

    Dmitri pointed out TimerTask, which would let you avoid the loop. You could just do the join call and the TimerTask you setup would take care of interrupting the thread. This would let you get more exact resolution without having to poll in a loop.

提交回复
热议问题