最近比较困扰的服务器线程挂起问题解决

  我们的应用是类似于网络硬盘一样的下载工具,网站访问量比较小,但是有个问题一直困扰着我们,就是was服务器隔一段时间就报线程挂起,时间有长有短,短的重启5分钟内就报。
  一般情况是:
  1.开应用服务器——用户下载——报线程挂起——下载量下降——报线程N长时间没活动,超过was设置的阀值,释放掉。
  2.开应用服务器——用户下载——报线程挂起——下载量继续或者上升,挂起线程越来越多——was自动调整线程阀值——调不过来,挂。

  经过查找,基本确定问题:是因为用户在用浏览器下载文件时,网络瞬断或其他原因,导致抛出异常,但是下载的线程并未释放。可打开浏览器下载,下到一半直接关掉浏览器来模拟这个现象。
  byte[] b = new byte[1024];
  ...
  while ((len = in.read(b)) != -1) {
    out.write(b, 0, len);
  }
  ...

  修改为
  byte[] b = new byte[1024];
  ...
  while ((len = in.read(b)) != -1) {
    Thread.sleep(50);
    Thread.yield();
    out.write(b, 0, len);
  }
  ...

  一些人建议的方法是,在服务器端给线程做个时间限制,超过时间的就关掉;但是这样做,较低网速下载大文件的用户,又会受到影响。因此用上面的做法是:线程处理一段时间,停一会,让出CPU控制权,不至于造成堵塞。
  这个方法可能不是最好的,但是至少是比较合适的,现在服务器上线程挂起的现象已经大大减少,并且额外加了一句
if (request.getHeader("Range") != null) {
  ErrShow(request, response, "不支持多线程!");
  return;
}

这样避免掉用下载工具的多线程下载。
 
  哪位有更优解,请提出来,一起讨论一下。
 
  刚才看到用守护线程来处理超时线程的解决方案,但另外一个技术主管极力反对,哪位能解释一下,为什么不可用?守护线程在什么情况下可用?谢谢

你可能感兴趣的:(多线程,thread,应用服务器,浏览器,网络应用)