有一个字符串数组,里面存储的是网址,有可访问和不可访问的
现要求每10秒循环访问这些网址,
如果某个网址连续3次访问都失败的,则放弃访问该网址,其它可以访问的继续每10秒访问一次
在1分钟之后对放弃访问的重新再访问,如果连续3次访问再失败的也一样放弃
如此不断循环

解决方案 »

  1.   

    如果网址数量不多,比如只有 百来个,直接每个线程负责一个网址就行了。如果网址数量贼多,比如上万个,就要用nio来处理了;这个会比较复杂。
      

  2.   

    那就得配合数据库访问罗。socket访问。
      

  3.   

    简单写了一个,仅供参考
    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);
    }
    }
    }}
      

  4.   

    这个是单线程的代码。
    在实际需求中,使用单一线程来访问多个地址,会出现滞后现象。
    一般的解决方案,是采用异步IO技术,现成的框架可以使用Mina。
    单个线程,或有限的几个线程,进行异步IO的操作,处理多个连接,
    这样,10秒或者1分钟的超时时间,可以更精确的到每一个地址上面。