多线程从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);
}

}
}

...全文
424 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);
            }
虽然不知道你怎么采集失败,但是这两个地方没有同步,显示你在采集数据的时候必然也没有做任何同步。如果你没写过多线程程序,先看看为什么要做线程同步吧

62,621

社区成员

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

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