我遇到了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虚拟机以及它如何处理线程。我的线程没有造成死锁。
线程执行的清晰度:
看起来线程无缘无故死亡,我不知道为什么?!
答案 0 :(得分:2)
可能是tcp / ip连接的操作系统可配置限制被命中,这导致JVM阻塞等待创建新的TCP / IP连接,这只有在已经使用的连接被关闭时才会发生。
这有助于找到正在发生的事情:
使用JVM本身附带的visualvm配置运行(使用jvisualvm在命令行上运行它)。应该指出创建了多少个线程以及为什么它们被阻塞,死锁等等。
等待它阻塞并获取JVM进程的线程转储,以使用jstack或visualvm检查线程堆栈跟踪中的死锁,搜索死锁关键字。
检查netstat -nao TCP连接的状态,查看操作系统限制是否被命中,如果阻塞发生时CLOSE_WAIT中有多个连接
你是企业代理/防火墙的后面,你可能会遇到其他类型的安全限制,阻止你打开更多的TCP连接,不一定是操作系统的限制
如果这些都没有帮助你总是可以使用更多的findinds来编辑问题,但是基于代码的描述,其他限制正在受到影响,初看起来似乎与JVM线程死锁无关,希望这会有所帮助。