- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了 java 线程的问题,我不确定它是否与我的方法有关,或者线程池是否能够解决我想要实现的目标。
for (int i = 0; i < 100; i++) {
verifier[i]=new Thread();
verifier[i].start();
}
我初始化了 100 个线程并启动它们。在线程中执行的代码只是
con = (HttpURLConnection) website.openConnection(url);
// gets only the header
con.setRequestMethod("HEAD");
con.setConnectTimeout(2000); // set timeout to 2 seconds
这些线程对一长串 url/数据重复上述过程。
前 50 个线程几乎立即执行,然后它们仅停止 60 秒左右,然后出现另一个执行峰值,其中 20 个线程左右同时完成,依此类推。即使有 4 个,也会出现同样的死锁。
我的第一个猜测是僵局。我不确定如何解决该问题并保持恒定的执行速度,而不出现死锁和停止。
我正在寻找关于为什么会发生这种情况以及如何解决它的解释。
通过 DeadLock,我了解了 Java 虚拟机以及它如何处理线程。不是我的线程引起的死锁。
线程执行的屏幕截图:
看起来线程无缘无故地死掉了,我不知道为什么?!
最佳答案
可能是操作系统对 tcp/ip 连接的可配置限制受到影响,这会导致 JVM 阻塞等待创建新的 TCP/IP 连接,只有在已使用的连接关闭时才会发生这种情况。
这可以帮助了解发生了什么:
使用 visualvm 分析运行情况它与 JVM 本身一起提供(使用 jvisualvm 在命令行上运行它)。应该指出创建了多少线程以及它们为何被阻塞、死锁等。
等待它阻塞并获取 JVM 进程的线程转储,以使用 jstack 或 VisualVM 检查线程堆栈跟踪中的死锁,搜索 deadlock 关键字。
使用 netstat -nao 检查 TCP 连接的状态,看看是否达到操作系统限制,发生阻塞时是否有许多连接处于 CLOSE_WAIT 状态
您是否处于公司代理/防火墙后面,您可能会遇到某种其他类型的安全限制,阻止您打开更多 TCP 连接,而不一定是操作系统的限制
如果这些都没有帮助,您可以随时通过进一步的查找来编辑问题,但根据代码的描述,其他限制正在受到打击,乍一看似乎与 JVM 线程死锁无关,希望这会有所帮助。
关于Java线程和HTTP请求死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20447114/
我是一名优秀的程序员,十分优秀!