我要实现的功能如下:
  采用的JSP和Servlet,
  现在有一个URL列表,我采用了实现Callable的接口实现有返回值的多线程,对每一个URL列表中的URL,开辟一个线程去请求该URL获取到HTML代码,当所有的线程都返回获取到结果的时候,然后在Servlet里面转向到JSP。JSP绑定所有的HTML到页面上显示。但是有个问题,就是如果某个线程获取到HTML代码超时的时候,导致所有的URL请求结果都不能显示。有的甚至JSP页面都无法打开,什么也不显示。请问该怎么解决?
多线程请求的代码如下:
ArrayList<Future<String>> al = new ArrayList<Future<String>>();ExecutorService exs = Executors.newCachedThreadPool();//创建线程池
ResultSet rus = dataOperator.getDataFromSqlDb("select url from form_inf where jh='是'");//获取到所有URL
while (rus.next()) {
 al.add(exs.submit(new Query(url));//Query(String url)是通过继承Callable接口实现的线程类,Call()内部通过URLConnection请求URL,返回结果String
}
//以上是将所有的URL请求发送出去
下面是接收返回结果:
ArrayList resultList = new ArrayList();//保存所有URL返回结果的list String result="";
for (Future<String> fs : al){
result= (String) fs.get(15,TimeUnit.SECONDS);//此处如果获取超时会抛出三个异常,其中就有TimeoutException
resultList.add(result);
}
session.removeAttribute("list");
session.setAttribute("list", resultList);//将保存了所有检索结果的resultList保存在session中
request.getRequestDispatcher("rus/show.jsp").forward(request, response);这样,在所有的URL都能正常响应的时候,程序没有问题,servlet会正常转向,但是一旦某个URL有问题,比如网速比较慢,fs.get(15,TimeUnit.SECONDS)这里获取结果超时,这时候就会出现java.util.concurrent.TimeoutException,然后其他的正常获取的URL结果也无法显示,JSP页面什么也不显示,我猜测是某个线程内部异常导致整个进程挂起,这个怎么解决?谢谢大家,可以追加分数!