一个Java编程题 有一个字符串数组,里面存储的是网址,有可访问和不可访问的现要求每10秒循环访问这些网址,如果某个网址连续3次访问都失败的,则放弃访问该网址,其它可以访问的继续每10秒访问一次在1分钟之后对放弃访问的重新再访问,如果连续3次访问再失败的也一样放弃如此不断循环 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果网址数量不多,比如只有 百来个,直接每个线程负责一个网址就行了。如果网址数量贼多,比如上万个,就要用nio来处理了;这个会比较复杂。 那就得配合数据库访问罗。socket访问。 简单写了一个,仅供参考package net.csdn.bbs.qqeszw;import java.net.MalformedURLException;import java.net.URL;import java.util.LinkedList;import java.util.List;public class URLTools { static long ActiveTime = 10*1000; static long InactiveTime = 60*1000; static long FaldCount = 3; static class URLInfo{ URL url; int faildCount;//连续失败的次数 boolean lastOK;//上次是否访问成功 long lastTime ;//上次访问时间 } private List<URLInfo> activeQueue = new LinkedList<URLInfo>(); public URLTools(String[] urls) throws MalformedURLException{ for(String url:urls){ URLInfo urlInfo = new URLInfo(); urlInfo.url = new URL(url); activeQueue.add(urlInfo); } } public boolean access(){ boolean access = false;//本次循环操作,是否有地址被访问。 for(URLInfo info : activeQueue){ if(info.lastTime + ActiveTime > System.currentTimeMillis()){ continue;//上次访问到现在未超过10秒,无需访问 } if(info.faildCount>=FaldCount && info.lastTime + InactiveTime > System.currentTimeMillis()){ continue;//连续失败3次,上次访问到现在未超过1分钟,无需访问 } info.lastOK = access(info.url); info.lastTime= System.currentTimeMillis(); if(info.lastOK){//如果访问成功 info.faildCount=0; }else{ info.faildCount++; } access = true; } return access; } private boolean access(URL url) { // TODO 处理对url的访问 return false; } /** * 测试用例 * @throws MalformedURLException */ public static void main(String[] args) throws Exception { String [] urls = new String []{"www.baidu.com","http://www.sohu.com"}; URLTools tools = new URLTools(urls); while(true){ if(tools.access()){ Thread.sleep(10); } } }} 这个是单线程的代码。在实际需求中,使用单一线程来访问多个地址,会出现滞后现象。一般的解决方案,是采用异步IO技术,现成的框架可以使用Mina。单个线程,或有限的几个线程,进行异步IO的操作,处理多个连接,这样,10秒或者1分钟的超时时间,可以更精确的到每一个地址上面。 发生java.net.ConnectException: Connection refused: connect什么原因? java与数据结构 jsp问题 多线程的CLOSE_WAIT问题,大家请进! 转换 请教linkedlist源代码,有点没明白什么意思。 关于密码的问题 没有装java环境的机器上不能正常加载java类吗? 如何在别的过程调用鼠标事件 小妹妹有难,请大虾们助我一吧! String str="Hello World!"; 这个在常量区里是什么样的对象,是连属性方法全带上了还是只是有这个值的属性??? 在java方法里面有没有必要写obj=null
package net.csdn.bbs.qqeszw;import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;public class URLTools { static long ActiveTime = 10*1000;
static long InactiveTime = 60*1000;
static long FaldCount = 3;
static class URLInfo{
URL url;
int faildCount;//连续失败的次数
boolean lastOK;//上次是否访问成功
long lastTime ;//上次访问时间
}
private List<URLInfo> activeQueue = new LinkedList<URLInfo>();
public URLTools(String[] urls) throws MalformedURLException{
for(String url:urls){
URLInfo urlInfo = new URLInfo();
urlInfo.url = new URL(url);
activeQueue.add(urlInfo);
}
}
public boolean access(){
boolean access = false;//本次循环操作,是否有地址被访问。
for(URLInfo info : activeQueue){
if(info.lastTime + ActiveTime > System.currentTimeMillis()){
continue;//上次访问到现在未超过10秒,无需访问
}
if(info.faildCount>=FaldCount && info.lastTime + InactiveTime > System.currentTimeMillis()){
continue;//连续失败3次,上次访问到现在未超过1分钟,无需访问
}
info.lastOK = access(info.url);
info.lastTime= System.currentTimeMillis();
if(info.lastOK){//如果访问成功
info.faildCount=0;
}else{
info.faildCount++;
}
access = true;
}
return access;
}
private boolean access(URL url) {
// TODO 处理对url的访问
return false;
} /**
* 测试用例
* @throws MalformedURLException
*/
public static void main(String[] args) throws Exception {
String [] urls = new String []{"www.baidu.com","http://www.sohu.com"};
URLTools tools = new URLTools(urls);
while(true){
if(tools.access()){
Thread.sleep(10);
}
}
}}
在实际需求中,使用单一线程来访问多个地址,会出现滞后现象。
一般的解决方案,是采用异步IO技术,现成的框架可以使用Mina。
单个线程,或有限的几个线程,进行异步IO的操作,处理多个连接,
这样,10秒或者1分钟的超时时间,可以更精确的到每一个地址上面。