【发布时间】:2014-12-28 04:42:46
【问题描述】:
我正在制作一个代理检查器,我已经制作了一个前一个,它是多线程的,但它为每个代理创建了一个新线程来检查,这就是我对这个做的,但是当我去使用它时检查 60k 代理它几乎融化了我的电脑哈哈。我试图限制一次运行的线程数量,但没有运气。我原来的做法是这样的
for(int i = 0; i < proxies.size(); i++){
final String s = proxies.get(i);
new Thread(){
public void run(){
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(s.split(":")[0], Integer.parseInt(s.split(":")[1])));
if(checkProxy(proxy, 5000))
textArea_1.setText(textArea_1.getText() + s + "\n");
progress++;
progressBar.setValue(progress);
}
}.start();
}
我试图限制的方法是让一个全局变量为每个新线程递增,然后在每个新线程结束时减去自身,认为循环会暂停并等待变量足够低以创建新线程像这样的线程
for(int i = 0; i < proxies.size() && runningThreads <= 5; i++){
runningThreads++;
final String s = proxies.get(i);
new Thread(){
public void run(){
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(s.split(":")[0], Integer.parseInt(s.split(":")[1])));
if(checkProxy(proxy, 5000))
textArea_1.setText(textArea_1.getText() + s + "\n");
progress++;
progressBar.setValue(progress);
runningThreads--;
}
}.start();
}
我目前没有想法,所以任何帮助都会很棒。
【问题讨论】:
-
为什么不从 for 循环中删除
&& runningThreads <= 5并在循环中添加一个 if 而不是if (runningThreads <= 5) { make a new thread }?如果你创建了一个线程,那么只增加i。 -
为什么不使用固定的线程池呢?此外,如果该进度条是一个 Swing JProgressBar,那么您的代码会通过对 EDT 进行 Swing 调用来忽略 Swing 线程规则。这可能会导致间歇性但有害的程序停止异常。
标签: java multithreading limit