如何运行java函数只需30分钟

时间:2010-09-29 21:35:02

标签: java function time timer

我需要创建一个只运行30分钟的java函数,并在30分钟结束时执行某些操作。但如果符合正确的条件,它也应该能够在给定时间之前自行终止。我不希望函数休眠,因为它应该收集数据,所以没有睡眠线程。

由于

4 个答案:

答案 0 :(得分:5)

使用:Timer.schedule( TimerTask, long )

public void someFunctino() {
    // set the timeout    
    // this will stop this function in 30 minutes
    long in30Minutes = 30 * 60 * 1000;
    Timer timer = new Timer();
    timer.schedule( new TimerTask(){
          public void run() {
               if( conditionsAreMet() ) { 
                   System.exit(0);
                }
           }
     },  in30Minutes );

     // do the work... 
      .... work for n time, it would be stoped in 30 minutes at most
      ... code code code
}

答案 1 :(得分:1)

获取System.currentTimeMillis()的开始时间,计算停止的时间,并在收集要收集的数据时不时检查当前时间。另一种方法是将计时器和数据收集分离,以便它们中的每一个都可以在自己的线程中运行。

要获得更具体的答案,如果您要告诉您正在收集的数据以及 收集数据

,将会很有帮助。

答案 2 :(得分:1)

这样的事情会起作用:

long startTime = System.currentTimeMillis();
long maxDurationInMilliseconds = 30 * 60 * 1000;

while (System.currentTimeMillis() < startTime + maxDurationInMilliseconds) {
    // carry on running - 30 minutes hasn't elapsed yet

    if (someOtherConditionIsMet) {
        // stop running early
        break;
    }
}

答案 3 :(得分:1)

现代java.util.concurrent方式将使用ExecutorService。有几种invoke方法暂停。

这是一个启动示例:

public static void main(String args[]) throws Exception {
    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.invokeAll(Arrays.asList(new Task()), 30, TimeUnit.MINUTES);
    executor.shutdown();
}

其中Task如下所示:

public class Task implements Callable<String> {

    @Override
    public String call() {
        // Just a dummy long running task.
        BigInteger i = new BigInteger("0");
        for (long l = 0; l < Long.MAX_VALUE; l++) {
            i.multiply(new BigInteger(String.valueOf(l)));

            // You need to check this regularly..
            if (Thread.interrupted()) {
                System.out.println("Task interrupted!");
                break; // ..and stop the task whenever Thread is interrupted.
            }
        }
        return null; // Or whatever you'd like to use as return value.
    }

}

另见: