2009-05-07 4 views
4

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

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

  1. Главная тема ждать
  2. Execute Пропустите
    • начало Запуск таймера Thread
    • Когда поток таймера закончится убить Execute Пропустите
  3. Выполнение резьбы остановить Главная
  4. нить резюме

Есть ли у кого-нибудь код для этой логики, шаблон дизайна, который я могу использовать, или страницу в Интернете, я могу прочитать некоторые сведения?

Благодаря

ответ

2

Посмотрите на пакет java.lang.concurrent в Java 5 и более поздних версиях, в частности на интерфейс CompletionService и классы, которые его реализуют.

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

2

Это будет ждать до 30 секунд для потока, чтобы закончить.

Thread t = new Thread() { 
    public void run() { 
    badExternalMethod(); 
    synchronized (this) { 
     notifyAll(); 
    } 
    } 
}; 

synchronized (t) { 
    t.start(); 
    try { 
    t.wait(30000); // 30 secs 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 
    } 
} 

// т завершена или истек

+0

Я думаю, вы имеете в виду t.join (30000) вместо t.wait (30000). –

+0

Спасибо, я проверю код и посмотрю, что произойдет с внешней библиотекой и какие ресурсы не будут удалены. –

1

Вы не сможете волшебным образом сделать остановку хода нити через 30 секунд; то, что вам нужно будет сделать, это сделать этот поток проверкой некоторого состояния после того, как время закончится, заметите, что оно заняло слишком много времени и return из его метода запуска.

Есть примерно два подхода к делать это:

  1. Есть нить библиотеки вызова выполняет свою работу в «кусках», которые берут небольшое количество времени каждого, и проверить состояние между каждым блоком. Например, если вы обрабатываете сотни тысяч записей, вы можете обработать несколько сотен в одной партии, а затем проверить флаг. Или, если вы делаете потенциально блокирующие вызовы с тайм-аутом, установите тайм-аут на 500 мс и отметьте флаг между каждым вызовом.
  2. Если основной поток прерывает поток вызовов библиотеки, когда время заканчивается, убедитесь, что поток библиотеки правильно обрабатывает прерывания и проверяет флаг, когда это так. Это потребует, чтобы поток вызовов библиотеки выполнял прерывистый метод, хотя любой потенциально долговременный метод должен допускать прерывания.

В обоих случаях вам нужно иметь один из потоков (вероятно, основной нити, поскольку это не имеет ничего делать не надо) набор «стоп» флаг true после того, как время истекло (и эту переменную должен быть объявлен изменчивым, чтобы обновления видели все потоки). Аналогично, когда поток вызова библиотеки видит этот флаг как истинный, он должен остановить то, что он делает, как правило, возвращаясь из метода run().

Вы не должны действительно убивать поток библиотеки из основного потока; см. Why are Thread.stop, Thread.suspend and Thread.resume Deprecated по причинам и альтернативе, которая очень похожа на то, что я описал выше.:-)

+0

Я думаю, что я закончу основной процесс изящно, когда зависает внешний вызов. Я не знаю, что делает внешняя библиотека, поэтому я не могу сказать, что происходит, когда я убиваю поток. –

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