Как запустить функцию Java всего за 30 минут - PullRequest
7 голосов
/ 30 сентября 2010

Мне нужно создать функцию Java, которая будет работать только в течение 30 минут, а по истечении 30 минут она что-то выполнит. Но он также должен иметь возможность самостоятельно завершить работу до наступления заданного времени, если будут выполнены правильные условия. Я не хочу, чтобы функция спала, поскольку она должна собирать данные, поэтому нет спящих потоков.

Спасибо

Ответы [ 4 ]

5 голосов
/ 30 сентября 2010

Использование: 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 голос
/ 30 сентября 2010

Современный способ 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.
    }

}

См.:

1 голос
/ 30 сентября 2010

Примерно так будет работать:

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;
    }
}
1 голос
/ 30 сентября 2010

Получите время начала с помощью System.currentTimeMillis(), рассчитайте время, когда нужно остановиться, и время от времени проверяйте текущее время, пока вы собираете данные, которые хотите собрать.Другим способом было бы разделить таймер и сбор данных, чтобы каждый из них мог работать в своих собственных потоках.

Для более конкретного ответа было бы полезно, если бы вы сказали что данных, которые вы собираете, и как вы их собираете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...