gpt4 book ai didi

Java线程和HTTP请求死锁

转载 作者:行者123 更新时间:2023-11-30 04:07:15 26 4
gpt4 key购买 nike

我遇到了 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 虚拟机以及它如何处理线程。不是我的线程引起的死锁。

线程执行的屏幕截图:

enter image description here

看起来线程无缘无故地死掉了,我不知道为什么?!

最佳答案

可能是操作系统对 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com