Убейте задачу в ThreadSecutor, если это займет больше времени. - PullRequest
1 голос
/ 11 октября 2011

Вот сценарий:

У меня есть основной процесс Java, который использует JMS для публикации в некотором брокере ActiveMQ.

Каждый раз, когда предполагается, что сообщение отправлено посреднику,поток используется из пула потоков фиксированного размера (используя ThreadExecutor), и внутри него выполняются вызовы публикации.

Теперь вызов публикации является блокирующим вызовом, и если брокер не работает, сам поток продолжает ждать.

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

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

Существуют ли какие-либо ThreadExecutors, которые позволяют мне немедленно прекратить поток, если поток не может выполнить задачу в течение определенного периода времени?мне ??

Хотелось бы от кого-нибудь более элегантного решения.

1 Ответ

1 голос
/ 11 октября 2011

Интерфейс ExecutorService предлагает методы invokeAll() и invokeAny() с параметром timeout.

Пример:

ExecutorService executor = Executors..newFixedThreadPool(2);
executor.invokeAll(Arrays.asList(new Callable<Void>(){

    @Override
    public Void call() throws Exception {
        try {
            // do your task
        } catch (InterruptedException e) {
            // your task was forced to end
        }
        return null;
    }

}), 5, TimeUnit.SECONDS);
executor.shutdown();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...