2011-03-09 3 views
8

У меня есть метод, который возвращает String, возможно ли, что после определенного времени treshold excedeed fot этот метод возвращает некоторую определенную строку?Установить ограничение времени выполнения для метода в java

+0

WAHT вы хотите, чтобы назвать ваш метод, и если время его выполнения превышает определенное количество возвращающегося строка является константой? – reef

+0

@reef nop, когда метод x, который возвращает некоторую строку, достигает, например, 6 секунд, когда он возвращает некоторую строку ошибки .. или просто имеет какой-то обратный вызов, который я могу использовать для обработки ошибки времени. – London

ответ

14

Guava library имеет очень красивый TimeLimiter, который позволяет вам делать это на любом методе, определяемом интерфейсом. Он может генерировать прокси для вашего объекта, который имеет «встроенный» тайм-аут.

+0

это кажется, просто позвольте мне спросить вас об этом, этот пример не ясен для меня, потому что я noob, 'для возврата значения target.someMethod()', этот «target» относится к экземпляру класса? – London

+0

другой вопрос, что делать, если этот метод открывает несколько сессий, они будут закрыты? Или мне нужно поставить эти закрытые сеансы перед возвратом значения по умолчанию? – London

+0

@London. 1) да, это то, что это значит. 2) метод должен закрыть эти сеансы с помощью 'try {...} finally {...}'. Но это должно быть так или иначе !!! –

9

Я делал что-то подобное в прошлом при нерестах внешнего процесса с Runtime.getRuntime().exec(command). Я думаю, что вы могли бы сделать что-то подобное в вашем методе:

Timer timer = new Timer(true); 
InterruptTimerTask interruptTimerTask = 
    new InterruptTimerTask(Thread.currentThread()); 
timer.schedule(interruptTimerTask, waitTimeout); 
try { 
    // put here the portion of code that may take more than "waitTimeout" 
} catch (InterruptedException e) { 
    log.error("timeout exeeded); 
} finally { 
    timer.cancel(); 
} 

и здесь InterruptTimerTask

/* 
* A TimerTask that interrupts the specified thread when run. 
*/ 
protected class InterruptTimerTask extends TimerTask { 

    private Thread theTread; 

    public InterruptTimerTask(Thread theTread) { 
     this.theTread = theTread; 
    } 

    @Override 
    public void run() { 
     theTread.interrupt(); 
    } 

} 
+0

«Scedule» не используется в качестве ограничения по времени, но в качестве задержки ... так что «waitTimeout» в этом случае является задержкой до выполнения прерыванияTimerTask ... из API: расписание указанной задачи для выполнения после указанного задержка. – Kayvar

+2

Я получаю сообщение об ошибке в try/catch: 'Unreachable catch block для InterruptedException. Это исключение никогда не выбрасывается из тела оператора try.' – Michael

1

Как ответил на @MarcoS

Я нашел тайм-аут не возникает, если метод блокировки что-то и не выпустить время процессора для таймера. Тогда Timer не может начать новую тему. Итак, я немного поменяю начальный поток. Немедленно и спать внутри темы.

 InterruptTimerTaskAddDel interruptTimerTask = new InterruptTimerTaskAddDel(
       Thread.currentThread(),timeout_msec); 

     timer.schedule(interruptTimerTask, 0); 

     /* 
* A TimerTask that interrupts the specified thread when run. 
*/ 
class InterruptTimerTaskAddDel extends TimerTask { 

    private Thread theTread; 
    private long timeout; 

    public InterruptTimerTaskAddDel(Thread theTread,long i_timeout) { 
     this.theTread = theTread; 
     timeout=i_timeout; 
    } 

    @Override 
    public void run() { 
     try { 
      Thread.currentThread().sleep(timeout); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(System.err); 
     } 
     theTread.interrupt(); 
    } 

} 
1

Вы можете использовать АОП и @Timeable аннотацию из jcabi-aspects (я разработчик):

@Timeable(limit = 1, unit = TimeUnit.SECONDS) 
String load(String resource) { 
    while (true) { 
    if (Thread.currentThread.isInterrupted()) { 
     throw new IllegalStateException("time out"); 
    } 
    // execution as usual 
    } 
} 

Когда лимит времени будет достигнут ваш поток получит interrupted() флаг установлен в true и это ваша работа правильно справиться с этой ситуацией и остановить выполнение.

Кроме того, проверить этот блог: http://www.yegor256.com/2014/06/20/limit-method-execution-time.html

Смежные вопросы