日期:2014-05-20 浏览次数:21016 次
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分钟的超时时间,可以更精确的到每一个地址上面。