[英]Java threads and HTTP requests deadlock
我在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个左右同时完成,依此类推。 即使有四个,也会发生相同的死锁。
我的第一个猜测是僵局。 我不确定如何解决问题并保持稳定的执行速度,而不会出现死锁和停止。
我正在寻找一种解释为什么会发生以及如何解决它。
通过DeadLock,我可以回顾Java虚拟机及其如何处理线程。 没有死线是由我的线程引起的。
线程执行屏幕快照:
线程似乎无缘无故地死了,我不知道为什么?!
可能是操作系统达到了tcp / ip连接的可配置限制,这导致JVM阻塞等待创建新的TCP / IP连接,只有在关闭已使用的连接时才会发生。
这可能有助于查找正在发生的情况:
轮廓与运行VisualVM的附带JVM本身(与jvisualvm在命令行上运行它)。 应该指出创建了多少个线程以及为什么它们被阻塞,死锁等。
等待它阻塞并进行JVM进程的线程转储,以使用jstack或visualvm检查线程堆栈跟踪中的死锁,并搜索deadlock关键字。
使用netstat -nao检查TCP连接的状态,以查看是否达到操作系统限制,在发生阻塞时CLOSE_WAIT中是否有许多连接
在企业代理/防火墙的背后,您可能会遇到其他类型的安全限制,该限制会阻止您打开更多的TCP连接,而不一定是操作系统的限制
如果以上方法都不能帮助您始终使用进一步的findinds编辑该问题,但是基于代码的描述,乍看之下似乎与JVM线程死锁无关的其他限制正在受到打击,希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.