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

本文探讨了应用服务器中线程挂起的问题及其解决方案。通过调整线程处理方式及限制多线程下载,有效减少了线程挂起的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们的应用是类似于网络硬盘一样的下载工具,网站访问量比较小,但是有个问题一直困扰着我们,就是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;
}

这样避免掉用下载工具的多线程下载。

哪位有更优解,请提出来,一起讨论一下。

刚才看到用守护线程来处理超时线程的解决方案,但另外一个技术主管极力反对,哪位能解释一下,为什么不可用?守护线程在什么情况下可用?谢谢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值