Как выполнить задание за определенный период в Java. - PullRequest
3 голосов
/ 16 июня 2010

Фактически, я бы выполнил определенную задачу (набор инструкций) за определенный период.

Например: я хочу, чтобы моя программа выполнила задачу в течение 5 минут, если она получит правильный результат, то остановится, иначе она продолжит выполнение обычной задачи в течение 5 минут, и в конце она скажет мне.

Как я могу реализовать это в Java.

Ответы [ 5 ]

4 голосов
/ 16 июня 2010

Вы могли бы что-то вроде следующего:

import java.util.concurrent.* ;

ExecutorService svc = Executors.newFixedThreadPool( 1 ) ;
svc.submit( new Runnable() {
  public void run() {
    // Do long running task
  }
} ) ;
svc.shutdown() ;
svc.awaitTermination( 300, TimeUnit.SECONDS ) ;

Javadocs для ExecutorService здесь

[править]

Я, вероятно, должен отметить, однакочто в зависимости от того, что делает ваша долгосрочная задача, может быть невозможно заставить ее прекратить выполнение

[edit2], метод submit возвращает объект Future, который затем можно вызвать get вкл с таймаутом .Этот вызов get будет блокироваться до тех пор, пока результат не будет готов или по истечении времени ожидания возникнет исключение TimeoutException.Таким образом, вы можете получить результат от своей длительной задачи, если это то, что вы хотели

2 голосов
/ 16 июня 2010

Самый надежный подход - использовать FutureTask с пулом потоков. Смотрите мой ответ на этот вопрос,

Тайм-аут Java-процесса

0 голосов
/ 16 июня 2010

Использовать будущее очень просто, на мой взгляд:

ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<?> f = executorService.submit(myTask);
try {
    f.get(timeout, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
    f.cancel(true);
}

Но, конечно, созданный поток должен уметь обрабатывать прерывания.

0 голосов
/ 16 июня 2010

Начиная с Java 1.5 существует API высокого уровня для параллелизма. Он включает в себя набор интерфейсов, называемых Executors . Они могут помочь вам.

0 голосов
/ 16 июня 2010

Возможно, вы захотите использовать комбинацию Timer и TimerTask. Создайте новый таймер и вызовите метод расписания (TimerTask, long, long) для его запуска. Ваш объект TimerTask будет элементом, отвечающим за проверку вашего состояния выхода.

...