日期:2014-05-20  浏览次数:20971 次

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

------解决方案--------------------
简单写了一个,仅供参考
Java code
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分钟的超时时间,可以更精确的到每一个地址上面。