【问题标题】:Java threads and HTTP requests deadlockJava 线程和 HTTP 请求死锁
【发布时间】:2013-12-07 21:49:26
【问题描述】:

我遇到了 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/data 重复上述过程。

前 50 个线程几乎立即执行,然后它们仅停止 60 秒左右,然后出现另一个执行高峰,其中 20 个左右同时完成,依此类推。即使有 4 个,也会发生相同的死锁。

我的第一个猜测是死锁。我不确定如何解决问题并保持恒定的执行速度,而不会出现死锁和停止。

我正在寻找解释为什么会发生这种情况以及如何解决它。

通过 DeadLock,我了解了 Java 虚拟机以及它如何处理线程。不是我的线程造成的死锁。

线程执行的屏幕截图:

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

【问题讨论】:

  • 要发生死锁,您必须使用synchronized.wait() 或其他类型的java.util.concurrent 相关的东西。你在某个地方这样做吗?
  • 根据您的建议,我不确定您是否理解我在做什么。我没有共享任何资源,我指的是 Java 虚拟机线程处理导致的死锁。
  • Java 的线程不会突然死锁。有两个原因限制了它们:软件阻塞和 cpu 内核提供的计算时间限制。如果您的软件没有限制,您仍然可以在网络(如您的带宽)、网络实现中或仅在 CPU 负载上达到限制。
  • 我想说明的是,Java 的虚拟机在网络包方面存在问题,无法预测接下来要执行的线程,这导致了我认为的死锁。它不是一个错误,但这是我的假设,这就是为什么我要寻找一个更好的。
  • 如果您添加更多代码,例如 100 个线程如何工作以及如何确保线程不会访问其他人未访问过的网站,我们可能会提供更多帮助。顺便说一句,它实际上是new Thread(),即没有子类也没有Runnable?这意味着您只需启动什么都不做的线程然后退出。

标签: java multithreading networking network-programming threadpool


【解决方案1】:

可能是操作系统可配置的 tcp/ip 连接限制被击中,导致 JVM 阻塞等待新的 TCP/IP 连接创建,这只会在已经使用 get 的连接关闭时发生。

这可能有助于找出发生了什么:

  • 使用 JVM 自带的 visualvm 分析运行(使用 jvisualvm 在命令行上运行)。应该指出创建了多少线程以及它们为什么被阻塞、死锁等。

  • 等待它阻塞并获取JVM进程的线程转储以使用jstack或visualvm检查线程堆栈跟踪中的死锁,搜索死锁关键字。

  • 使用 netstat -nao 检查 TCP 连接的状态,查看是否达到操作系统限制,在阻塞发生时是否有许多 CLOSE_WAIT 中的连接

  • 您是否在公司代理/防火墙后面,您可能遇到了其他类型的安全限制,阻止您打开更多 TCP 连接,不一定是操作系统的限制

如果这些都没有帮助,您可以随时通过进一步的发现来编辑问题,但根据代码的描述,其他限制正在受到影响,乍一看似乎与 JVM 线程死锁无关,希望这会有所帮助。

【讨论】:

  • 非常有帮助的答案。我在上面发布了一个代码,您可以在我检查您列表中的所有内容时阅读该代码。
  • 我已经更新了一些关于描述的更多信息。线程在执行过程中一段时间​​后死亡。
  • 如果出现 IOException,验证程序不会记录任何内容,catch 块仅包含 return 0。修复日志记录并添加更多日志记录语句应该可以确定线程死亡的原因。
猜你喜欢
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 2014-03-20
  • 1970-01-01
相关资源
最近更新 更多