如何在Java中的一段时间后停止执行?

s20*_*der 23 java time

在代码中,变量计时器将指定结束while循环的持续时间,例如60秒.

   while(timer) {
    //run
    //terminate after 60 sec
   }
Run Code Online (Sandbox Code Playgroud)

Mat*_*all 46

long start = System.currentTimeMillis();
long end = start + 60*1000; // 60 seconds * 1000 ms/sec
while (System.currentTimeMillis() < end)
{
    // run
}
Run Code Online (Sandbox Code Playgroud)

  • 但是如果循环的一次迭代在59秒开始并且循环的每次迭代花费超过1秒时开始,你会超过60秒吗?这是最好的.我要求纯粹的无知. (8认同)
  • 好的,但检查只发生在循环的开始.因此,如果在循环开始时,说已经过了59秒,并且循环的每次迭代都需要5秒.下一次while循环是条件被检查时,将经过64秒.是的,还是我错过了什么? (6认同)
  • 我相信拉米是对的.假设循环中的工作需要7秒才能完成.一次运行后,您将在7秒,然后是14 ......直到您完成8次迭代,总共56秒.检查将成功(因为您未满60岁),但计算将需要7秒.再次检查时,你的时间是63秒.随着时间的推移,这是5%. (6认同)

d0x*_*d0x 23

您应该尝试新的Java Executor服务. http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

有了这个,你不需要自己编程循环时间.

public class Starter {

    public static void main(final String[] args) {
        final ExecutorService service = Executors.newSingleThreadExecutor();

        try {
            final Future<Object> f = service.submit(() -> {
                // Do you long running calculation here
                Thread.sleep(1337); // Simulate some delay
                return "42";
            });

            System.out.println(f.get(1, TimeUnit.SECONDS));
        } catch (final TimeoutException e) {
            System.err.println("Calculation took to long");
        } catch (final Exception e) {
            throw new RuntimeException(e);
        } finally {
            service.shutdown();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


MBC*_*ook 5

如果你不能超过你的时间限制(这是一个硬限制),那么线程是你最好的选择。一旦达到时间阈值,您可以使用循环来终止线程。当时该线程中发生的任何事情都可以被中断,从而使计算几乎立即停止。下面是一个例子:

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
Run Code Online (Sandbox Code Playgroud)

这将使您的分辨率达到大约 1/2 秒。通过在 while 循环中更频繁地轮询,您可以解决这个问题。

你的 runnable 的运行看起来像这样:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

根据 Dmitri 的回答进行更新

Dmitri 指出TimerTask,它可以让你避免循环。您可以只执行 join 调用,您设置的 TimerTask 将负责中断线程。这将使您获得更精确的分辨率,而无需循环轮询。