以下是该方案:
我有一个java主进程,它使用JMS发布到某个ActiveMQ代理。
每次将消息发送到代理时,都会从固定大小的线程池(使用ThreadExecutor)中使用一个线程,并在其中进行发布调用。
现在,发布调用是一个阻塞调用,如果代理已关闭,则线程本身会一直等待。
我想创建一个线程池,这样如果一个特定的线程没有在X时间内完成任务,它就会返回,即如果代理已关闭并且发布没有通过,则线程不会继续等待而是返回游泳池。
现在没办法让这个发布调用异步,所以处理这种情况的唯一方法就是上面提到的那个。我猜。
是否有任何ThreadExecutors允许我立即终止线程,如果线程无法在给定的时间帧内完成任务?
会喜欢某人更优雅的解决方案。
答案 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();