【发布时间】: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