我们的应用是类似于网络硬盘一样的下载工具,网站访问量比较小,但是有个问题一直困扰着我们,就是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;
}
这样避免掉用下载工具的多线程下载。
哪位有更优解,请提出来,一起讨论一下。
刚才看到用守护线程来处理超时线程的解决方案,但另外一个技术主管极力反对,哪位能解释一下,为什么不可用?守护线程在什么情况下可用?谢谢
分享到:
相关推荐
了解和掌握易语言中的线程挂起与恢复机制,不仅可以帮助我们编写出更加高效、可控的多线程程序,还能为解决并发问题提供有效的工具。通过实践和学习易语言线程挂起与恢复的源码示例,我们可以深入理解这些概念,并将...
启动挂起的线程时,要确保没有未解决的同步问题,否则可能会引发竞态条件或其他并发问题。 5. **多次挂起与启动** 提到的代码支持线程的多次挂起和启动,这意味着它可能包含了一个机制来跟踪线程的状态,并在适当...
c++多线程的创建挂起执行终止 线程间的同步
在编程中,我们常常需要对线程进行控制,包括挂起、唤醒和终止等操作,以实现更加灵活的程序设计。下面我们将深入探讨这些知识点。 首先,线程的挂起是指将一个正在运行的线程暂停执行,使其进入等待状态。这通常...
8. 在挂起按钮函数中,编写如下代码: if(SuspendThread(hThread1)==0xFFFFFFFF) { MessageBox("挂起失败!进程可能已经死亡或未创建!"); return; } 9. 在执行按钮函数中,编写如下代码: if(ResumeThread...
解决服务器挂起问题并不一定需要完成所有排查步骤,有时只需进行简单的诊断即可定位问题。以下是一些关键的排查环节: 1. **资源耗尽**:服务器挂起的常见原因是资源不足,如执行线程被耗尽或因死锁而无法处理新...
在这个场景中,我们将重点讨论如何利用`NtQuerySystemInformation`来判断线程是否被挂起以及理解线程的状态。 `NtQuerySystemInformation`函数是Windows NT内核提供的一种低级别接口,允许用户模式的应用程序获取...
本篇文章将深入探讨线程的挂起与恢复,以及如何创建线程,并简要提及线程间的消息传递。 1. 线程的创建 在大多数编程语言中,如Java、C#或Python,都有内置的多线程支持。在Java中,可以使用`Thread`类的子类化或...
### 并发服务器—多线程服务器详解 #### 一、引言 在现代软件开发中,特别是网络应用和服务的设计中,对并发处理能力的需求日益增长。为了满足高并发访问的需求,开发人员常采用多线程技术来构建高效、响应迅速的...
这份源码可能包含了创建线程、挂起线程、恢复线程、销毁线程的实际示例,对于深入理解易语言的线程控制机制非常有帮助。通过阅读和分析源代码,可以掌握如何在实际项目中应用这些技术,提升编程技能。
这个函数会减少线程的挂起计数,当计数达到零时,线程将被挂起,不再执行。挂起线程可以防止其占用系统资源,或者等待某个条件满足后再继续执行。然而,需要注意的是,不正确的挂起操作可能导致死锁或其他难以预料的...
线程的暂停和挂起在.NET中并不直接支持,因为这些操作可能导致死锁或资源独占问题。不过,可以使用`Monitor.Wait()`和`Monitor.Pulse()`配合信号量来模拟暂停和恢复线程的行为。 加锁是实现临界区互斥操作的重要...
在多线程编程中,挂起和恢复线程是两个重要的操作,它们允许开发者控制线程的执行流程,以优化程序性能或者解决特定问题。挂起线程意味着暂时停止一个线程的执行,而恢复线程则是在线程被挂起后重新启动它的执行。...
本人利用Thread.Abort()与Thread.Interrupt()可以引起目标线程异常的特点,开发了一种不使用已过时的方法来变相从外部控制线程的挂起与恢复的技术,原理简单,方便理解。 相关技术参考:...
在这种模式下,服务器线程在等待IO操作完成时会被挂起,直到数据传输完毕才能继续执行其他任务。这在处理大量并发连接时可能会导致效率降低,因为服务器资源可能大部分时间都在等待IO操作。 相反,异步IO...
"基于Qt的多线程并发服务器"是一个典型的解决方案,它利用了Qt库的强大功能,特别是其对多线程的支持,来处理来自多个客户端的并发请求。下面我们将深入探讨这个主题。 首先,Qt是一个跨平台的应用程序开发框架,...
线程的挂起、唤醒和终止是其中三个关键的操作,它们允许开发者在程序中有效地控制并发执行的线程。下面我们将深入探讨这些概念及其相关的API函数。 首先,线程的挂起是一个临时停止线程执行的过程。在Windows API中...
线程控制是Java多线程编程中的重要概念,包括中断、挂起、恢复和停止。本实例将深入探讨这些主题,帮助你更好地理解和掌握Java中线程的高级操作。 1. **线程中断**: Java通过`Thread.interrupt()`方法提供线程...
在IT领域,客户端-服务器架构、多线程服务器和远程方法调用(RMI)是构建分布式系统中的关键概念。让我们深入探讨这三个主题,并了解它们如何在Java编程中实现。 首先,客户端-服务器架构是一种通信模型,其中...
在计算机系统设计中,服务器模型是决定服务处理方式的关键因素,主要分为进程服务器模型和线程服务器模型。这两种模型在处理并发请求、资源管理和性能优化方面各有特点。 **进程服务器模型** 进程服务器模型...