如果需要更多时间,请在threadexecutor中终止任务

时间:2011-10-11 16:04:11

标签: java spring jms

以下是该方案:

我有一个java主进程,它使用JMS发布到某个ActiveMQ代理。

每次将消息发送到代理时,都会从固定大小的线程池(使用ThreadExecutor)中使用一个线程,并在其中进行发布调用。

现在,发布调用是一个阻塞调用,如果代理已关闭,则线程本身会一直等待。

我想创建一个线程池,这样如果一个特定的线程没有在X时间内完成任务,它就会返回,即如果代理已关闭并且发布没有通过,则线程不会继续等待而是返回游泳池。

现在没办法让这个发布调用异步,所以处理这种情况的唯一方法就是上面提到的那个。我猜。

是否有任何ThreadExecutors允许我立即终止线程,如果线程无法在给定的时间帧内完成任务?

会喜欢某人更优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

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();