Java单线程阻塞解决方案
?
转至:http://www.blogjava.net/unser/archive/2008/01/09/174052.html
?
一个Feed提取小程序,但有时由于Feed长时间无响应,所以需要去判断是否超时,以下的程序
主线程:
package?test.thread;
import?com.sun.syndication.feed.synd.SyndFeed;
public?class?RssThread?extends?Thread?{
????
????public?void?run()?{
????????while(true)
????????{
????????????try
????????????{
????????????????
????????????????System.out.println("start");
????????????????
????????????????String[]?str?=?new?String[]{"http://del.icio.us/rss/geneboy",
????????????????????????"http://picasaweb.google.com/data/feed/base/user/icyleaf.cn",
????????????????????????"http://feeds.qzone.qq.com/cgi-bin/cgi_rss_out?uin=414680"};
????????????????
????????????????for(?int?i?=?0?;?i?<?str.length?;?i++?)
????????????????{
????????????????????System.out.println("url?=?"?+?str[i]);
????????????????????RssUtil?ru?=?new?RssUtil();
????????????????????ru.setUrl(str[i]);
????????????????????ru.start();
????????????????????
????????????????????while(true)
????????????????????{
????????????????????????sleep(2000);
????????????????????????SyndFeed?feed?=?ru.getFeed();
????????????????????????System.out.println("feed?=?"?+?(feed?!=?null???"ok"?:?"timeOut"));
????????????????????????
????????????????????????if?(?feed?==?null?)
????????????????????????{
????????????????????????????sleep(10000);
????????????????????????????
????????????????????????????feed?=?ru.getFeed();
????????????????????????????System.out.println("second?feed?=?"?+?(feed?!=?null???"ok"?:?"timeOut"));
????????????????????????}????????????????????????????
????????????????????????
????????????????????????if?(?feed?==?null?)
????????????????????????{
????????????????????????????break;
????????????????????????}
????????????????????????else
????????????????????????{
????????????????????????????System.out.println("处理不null");
????????????????????????????break;
????????????????????????}
????????????????????}
????????????????}
????????????????
????????????????System.out.println("end");
????????????????
????????????????sleep(2000);
????????????????
????????????}catch(Exception?e)
????????????{
????????????????//e.printStackTrace();
????????????}
????????}????????
????}
????
????public?static?void?main(String[]?args)
????{
????????RssThread?rss?=?new?RssThread();
????????rss.start();
????}
}
RssUtil:负责提取Rss
package?test.thread;
import?java.net.URL;
import?org.apache.commons.logging.Log;
import?org.apache.commons.logging.LogFactory;
import?com.sun.syndication.feed.synd.SyndFeed;
import?com.sun.syndication.io.SyndFeedInput;
import?com.sun.syndication.io.XmlReader;
/**
?*?Rss相关
?*?
?*?@author?Administrator
?*?
?*/
public?class?RssUtil?extends?Thread?{
????
????private?String?url;
????
????private?SyndFeed?feed;
????private?static?final?Log?logger?=?LogFactory.getLog(RssUtil.class);
????
????public?void?run()?{
????????
????????feed?=?getFeed(url);
????}
????/**
?????*?获得Feed
?????*?
?????*?@param?url
?????*?@return
?????*/
????public?SyndFeed?getFeed(String?url)?{
????????try?
????????{
????????????URL?feedUrl?=?new?URL(url);
????????????SyndFeedInput?input?=?new?SyndFeedInput();
????????????SyndFeed?feed?=?input.build(new?XmlReader(feedUrl));
????????????return?feed;
????????????
????????}?catch?(Exception?ex)?{
????????????//ex.printStackTrace();
????????}
????????return?null;
????}
????public?SyndFeed?getFeed()?{
????????return?feed;
????}
????public?void?setFeed(SyndFeed?feed)?{
????????this.feed?=?feed;
????}
????public?String?getUrl()?{
????????return?url;
????}
????public?void?setUrl(String?url)?{
????????this.url?=?url;
????}
}<!--EndFragment-->