当前位置: 代码迷 >> J2SE >> 一个Java编程题,该怎么解决
  详细解决方案

一个Java编程题,该怎么解决

热度:44   发布时间:2016-04-24 00:36:15.0
一个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分钟的超时时间,可以更精确的到每一个地址上面。
  相关解决方案