JAVA多线程执行的困惑

在多线程操作中如何让数据共享,通过设置 static 的变量, 对操作该变量的方法实现同步机制

public class TradeDetail extends BaseCollect implements Runnable {
private static String CID = "tradeDetail";//配置文件中此栏目的前缀名
private String _dt;//日期
private String _id;//日期的yyyyMMdd
private String _year;//
private String _code;//股票代码
private String _url;//将参数据替换后的URL
//默认构造方法
public TradeDetail() {
super(CID);
}

//构造方法2
public TradeDetail(String dt) {
super(CID);
SetDt(dt);
}

//构造方法1
public TradeDetail(String code,String dt) {
super(CID);
SetDt(dt);
this._code = code;
}

public void SetDt(String dt) {
try {
this._dt = dt;
this._id = dt.replaceAll("-", "");
this._year = dt.substring(0, 4);
} catch (Exception e) {}
}
public void SetCode(String code){
this._code=code;
}
//将基类中的URL替换
private void ConvertUrl() {
_url = url.replaceAll("#code", _code).replaceAll("#id",
_dt.replaceAll("-", ""));
}


//插入数据方法
public void ProcessData(){
ConvertUrl();
String aa = super.getHTML(_url);//获取数据
int cc=0;
try{
String[] sour = aa.split("\\],\\[");
int len;
try {
String stockName=sour[0].split("','")[1];
len = sour.length;
cc =(len-1);
} catch (ArrayIndexOutOfBoundsException ex) {
//不存在这支股票的分笔数据,记录日志
return ;
}
StringBuffer sb = new StringBuffer();
for (int i = 1; i < len; i++) {
String[] k = sour[i].split("','");
sb.append(" INSERT INTO tradeDetail_2011");
sb.append(" VALUES("+i+",1");
sb.append(_code+",'");
sb.append(_dt+k[0].replaceFirst("'"," ")+"',");
sb.append(k[1]+","+k[2]+",");
sb.append(Integer.parseInt(k[1])*Float.parseFloat(k[2])*100+",");
sb.append(k[5].substring(0,1)+")");
}
try {
ExecSQL dao = new ExecSQL(sb.toString());
dao.Insert();
} catch (SQLException ex) {
ex.printStackTrace();
}
}catch(Exception ex){
ex.printStackTrace();
}
addCountRows(cc);
}


public List<String> threadArr;
public void run() {
String tn = Thread.currentThread().getName();
// System.out.println("线程:"+tn+" 开始执行");
addTheard(tn);
if (threadArr !=null) {
for(int i = 0;i<threadArr.size();i++){
SetCode(threadArr.get(i));
ProcessData();
}
}
removeThread(tn);
}

private static int CountRows;

private synchronized void addCountRows(int row){
CountRows+=row;
}

private static ArrayList<String> jsArr = null;
private static long begDatetime = 0;
//添加一个线程组名称
private synchronized void addTheard(String threadName) {
if (jsArr == null) {
CountRows = 0;
begDatetime = System.currentTimeMillis();
System.out.println("开始运行多线程执行 " + Util.GETDT());//正常情况只打印一次。
jsArr = new ArrayList<String>();
}

jsArr.add(threadName);
System.out.println("添加线程名称:"+threadName+" 当前共有:"+jsArr.size()+" 线程在执行");
}

//移除一个线程组名称
private synchronized void removeThread(String threadName) {
if (jsArr == null) {
return;
}
for (String d : jsArr) {
if (d.equals(threadName)) {
jsArr.remove(threadName);
break;
}
}

if (jsArr.size() > 0) {
System.out.println(threadName + "线程执行完毕,还剩 " + jsArr.size() +
" 线程进行中。。。");
} else {
System.out.println("所有线程执行完毕,共用时:" + Util.StatTime(begDatetime) +
" 共插入 " + CountRows + " 条数据");
}

}

}



测试类,创建五个线程:

class testtest{
public static void main(String[] args) {
ExecSQL dao = new ExecSQL("SELECT stock_code FROM stock_info WHERE stock_name NOT LIKE '%退市%'");
try {
List<String> arr = dao.GetStrs();

int a=5,j = arr.size(), s = (j + a-1) / a ;
for (int i = 1; i <= 5; i++) {
try {
TradeDetail t = new TradeDetail("2010-03-16");
t.threadArr = arr.subList((i - 1) * a + (i == 1 ? 0 : 1),
i * a >= j ? j : i * a);
Thread th = new Thread(t, (i - 1) * a + "-" + i * a);
th.start();
} catch (Exception e) {
e.printStackTrace();
continue;
}
}


} catch (SQLException ex) {
ex.printStackTrace();
}


}
}



打印出来的结果让我很困惑,为什么会打印五个"开始运行多线程执行 " ?
开始运行多线程执行 2010-3-16 13:49:20
开始运行多线程执行 2010-3-16 13:49:20
开始运行多线程执行 2010-3-16 13:49:20
开始运行多线程执行 2010-3-16 13:49:20
开始运行多线程执行 2010-3-16 13:49:20
添加线程名称:15-20 当前共有:1 线程在执行
添加线程名称:5-10 当前共有:1 线程在执行
添加线程名称:20-25 当前共有:1 线程在执行
添加线程名称:10-15 当前共有:1 线程在执行
添加线程名称:0-5 当前共有:1 线程在执行
20-25线程执行完毕,还剩 1 线程进行中。。。
10-15线程执行完毕,还剩 1 线程进行中。。。
15-20线程执行完毕,还剩 1 线程进行中。。。
5-10线程执行完毕,还剩 1 线程进行中。。。
所有线程执行完毕,共用时:0 分 5 秒 281 毫秒 共插入 7053 条数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值