62,614
社区成员
发帖
与我相关
我的任务
分享
// 启动多个线程同时采集数据
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);
}
}
}
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);
}
虽然不知道你怎么采集失败,但是这两个地方没有同步,显示你在采集数据的时候必然也没有做任何同步。如果你没写过多线程程序,先看看为什么要做线程同步吧