多线程从sina网采集股票实时数据

tcmis 2013-07-05 12:11:02
小弟从sina网采集股票的实时数据,写了一个多线程的采集,但总有些股票数据采集失败,如果一条一条的采集是没有问题的,不知道下面代码和方式那些存在问题,希望高手指点指点。

// 启动多个线程同时采集数据
for (int i = 0; i < totalThreadAmount; i++) {
GetDataThread getDataThread = new GetDataThread();
new Thread(getDataThread).start();
}


class GetDataThread implements Runnable {

public GetDataThread() {
}

@Override
public void run() {
URL url = null;
HttpURLConnection conn = null;
String curUrl = "";

while (!sinaGetDataUrls.isEmpty()) {

curUrl = (String) sinaGetDataUrls.get(0);
sinaGetDataUrls.remove(curUrl);

getedCount++;

try {
url = new URL(curUrl);
conn = (HttpURLConnection) url.openConnection();

conn.setUseCaches(false);
//设定请求方式为GET
conn.setRequestMethod("GET");
//一定要设为true,因为要发送数据
conn.setDoOutput(true);
conn.setDoInput(true);

conn.connect();
// 设置连接主机超时
conn.setConnectTimeout(50000);
// 设置从主机读取数据超时
conn.setReadTimeout(50000);

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "gbk"));
String s = "";
while ((s = br.readLine()) != null) {

//此处采集数据省略...

krStockRealtimeDataDAO.save(krStockRealtimeData);

}
txCurrentMakeCount.setText(" 已采集股票数:" + getedCount + " 未采集数:" + (stockTotal - getedCount));
}
} catch (Exception e) {
int startPosition = curUrl.indexOf("=");
txLog.append(jdate.toString(new Date(), 3) + " " + curUrl.substring(startPosition + 3, startPosition + 9) + " 采数失败 \n");
}finally{
conn.disconnect();
conn = null;
url = null;
}
}

endTimeMillis = System.currentTimeMillis();


if (sinaGetDataUrls.isEmpty() || (stockTotal - getedCount) <=0 ) {
finishedThreadAmount++;
}

if (finishedThreadAmount == totalThreadAmount){
txLog.append(jdate.toString(new Date(), 3) + " 本次采集完成 " + " \n");
txCurrentMakeCount.setText(" 用时:" + ((endTimeMillis - startTimeMillis) / 1000) + "秒");
btManualExec.setEnabled(true);
timer = new Timer();
timer.schedule(new AutoGetStockDataTask(), 2000, 1000);
}

}
}

...全文
357 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
穆爾饃饃 2014-03-07
  • 打赏
  • 举报
回复
采集多了网站不许怎么办? 我觉得不稳定 我有实时稳定兔费的数据获取方法 感兴趣的话十十我的扣扣 1950騰954縢939
rumlee 2013-07-05
  • 打赏
  • 举报
回复
采集失败出现什么异常信息? 数据采集出现部分失败很正常,你的程序需要对异常进行处理,比如可以设置成如果采集失败,重新采集,超过3次失败,过一个时间差之后再重新采集。 网络操作总会是有异常的,很正常。
yjflinchong 2013-07-05
  • 打赏
  • 举报
回复
2个星的高手了。 多线程应该对于你 不是难事
lcf 2013-07-05
  • 打赏
  • 举报
回复
这是很深的坑,从最基础的线程概念开始学吧
tcmis 2013-07-05
  • 打赏
  • 举报
回复
呵呵,没有写过线程的东东。。
lcf 2013-07-05
  • 打赏
  • 举报
回复
curUrl = (String) sinaGetDataUrls.get(0);
sinaGetDataUrls.remove(curUrl);

getedCount++; // gotCount, use correct English!
            if (sinaGetDataUrls.isEmpty() || (stockTotal - getedCount) <=0 ) {
                finishedThreadAmount++;
            }
             
            if (finishedThreadAmount == totalThreadAmount){
                txLog.append(jdate.toString(new Date(), 3) + "  本次采集完成 " + " \n");
                txCurrentMakeCount.setText(" 用时:" + ((endTimeMillis - startTimeMillis) / 1000) + "秒");
                btManualExec.setEnabled(true);
                timer = new Timer();
                timer.schedule(new AutoGetStockDataTask(), 2000, 1000);
            }
虽然不知道你怎么采集失败,但是这两个地方没有同步,显示你在采集数据的时候必然也没有做任何同步。如果你没写过多线程程序,先看看为什么要做线程同步吧
大型站架构演化 大型站软件系统的特点 大型站架构演化发展历程 初始阶段 应用服务和数据服务分离 使用缓存改善站性能 缓存类型 本地缓存 分布式缓存 缓存产品 redis 业界主流 memcached 解决问题 数据库访问 使用应用服务器集群改善站的并发处理能力 问题: 负载均衡情况下session状态的保持? 解决方案: 基于DNS的负载均衡 反向代理 ngix JK2 数据库的读写分离 问题: 读库与写库的数据同步 解决方案: 不同的数据库都有自己的数据库的主从复制功能 使用反向代理与CDN加速站响应 反向代理产品 ngix 使用分布式文件系统和分布式数据库系统 使用no-sql和搜索引擎 站内搜索 lucene nutch 分词器 no-sql库 mongodb hadoop 业务拆分 web service restful 分布式服务 大型站架构演化的价值观 核心价值:随站所需灵活应对 驱动力量:站的业务发展 站架构设计误区 一味追随大公司的解决方案 为技术而技术 企图用技术解决一切问题 大型站架构模式 架构模式 分层 分割 分布式 分布式应用和服务 分布式静态资源 分布式数据和存储 分布式计算 集群 缓存 CDN 反向代理 本地缓存 分布式缓存 异步 冗佘 冷备份 主从分离,实时同步实现热备份 灾备数据中心 自动化 发布过程自动化 ant maven. 自动化代码管理 svn cvs github 自动化测试 loadrunner hudson. 自动化安全测试 自动化部署 自动化报警 自动化失效转移 自动化失效恢复 自动化降级 自动化分配资源 安全 密码和手机校验码 数据库中的密码加密后存 -> 不可ni -> md5 加密 子主题 1 验证码 防止机器登录 对于攻击站的XSS攻击,SQL注入,进行编码转换 对垃圾信息,敏感信息进行过滤 对交易转账等重要操作根据交易模式和交易信息进行风险控制 Sina微博的应用 大型站架构要素 性能 可用性 伸缩性 扩展性 安全性 瞬时响应:站的高性能架构 站的性能测试 不同的视角 用户的视角 开发人员的视角 运维人员的视角 性能测试指标 响应时间 并发数 吞吐量 性能测试方法 性能测试 负载测试 压力测试 稳定性测试 web 前端性能优化 浏览器优化 减少http请求 使用浏览器缓存 启用压缩 css上,js下 减少cookie传输, 静态资源使用独立域名访问 CDN加速 反向代理 应用服务器性能优化 分布式缓存 缓存的原理 合理使用缓存 频繁修改的数据 没有热点的访问 数据不一致和脏读 缓存可用性 缓存预热 缓存穿透 缓存架构 jboss cache为代表的需要更新同步的分布式级缓存 以memcached为代表的不互相通信的分布式缓存 异步操作 使用集群 代码优化 多线程 资源复用 单例 对象池 数据结构 垃圾回收 存储性能优化 固态硬盘 RAID与HDFS 万无一失:站的高可用性 高可性的度量与考核 度量 考核 高可用的站架构 高可用的应用 高可用的服务 高可用的数据 CAP原理 数据备份 失效转移 高可用站的软件质量保证 站发布 自动化测试 预发布验证 代码控制 自动化发布 灰度发布 站运行临控 临控数据采集 临控管理 永无止境:站的可伸缩性 站架构的伸缩性设计 不同功能进行物理分离实现伸缩 单一功能通过集群规模实现伸缩 应用服务器集群的伸缩性设计 http重定向负载均衡 DNS域名解析负载均衡 反向代理负载均衡 ip负载均衡 数据链路层负载均衡 负载均衡算法 分布式缓存集群的伸缩性设计 memcached分布式缓存集群的访问模型 memcached分布式缓存集群的伸缩性挑战 分布式缓存的一致性hash算法 数据存储服务器集群的伸缩性设计 关系数据库集群的伸缩性设计 nosql数据库的伸缩性设计 随需应变:站的可扩展性 构建可扩展的站架构 利用分布式消息队列降低系统耦合性 事件驱动架构 分布式消息队列 利用分布式服务打造可复用的业务平台 web service与企业级分布式服务 大型站分布式服务的需求与特点 分布式服务框架设计 可扩展的数据结构 利用开放平台建设站生态圈 固若金汤:站的安全架构 站应用攻击与防御 XSS攻击 反射型 持久型 防御方法 消毒 httponly 注入攻击 SQL注入攻击 攻击前提 获取数据库结构的方法 防御方法 消毒 参数绑定 OS注入攻击 CSRF攻击 防御方法 表单token 验证码 referer check 1. 络流量统计 2. 防盗链 error code html注释 文件上传 web应用防火墙 modsecurity NEC的 siteshell 站安全漏洞扫描 信息加密技术及密钥安全管理 案例: CSDN 信息加密技术分类 单项散列加密 对称加密 非对称加密 密钥安全管理 将密钥和算法放在一个独立的服务器上,对外提供加密和解密服务 密钥放在独立服务器中,算法放在应用程序中。 信息过滤与反垃圾 文本匹配_敏感词过滤 正则表达式 trie树 双数组trie树 多级Hash表 信息降噪 分类算法_内容识别 黑名单 电子商务风险控制 风险 账户风险 买家风险 卖家风险 交易风险 风控 人工 自动 规则引擎 统计模型 案例 购秒杀系统架构 购秒杀系统架构

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧