java多线程遇到的回调的问题

口口口S口口口 2018-05-15 05:38:56
今天在用服务器处理excel上传的数据的时候遇到的问题。我的流程是一次读取excel里面900条数据,然后把900条数据保存在数据库中,这个操作完成之后再取下面的900条依次类推。这两步:取数据-存数据是两个线程,其中用一个boolean flag来判断存数据是否完成。
这里就有问题:当我直接while(!flag);和while(!flag){};时这个流程只能走一次,也就是只能取900条。让我在while里面加上打印语句之后就可以完整走完整个流程。
请问诸位这是什么原因导致的?

class saveDataClass implements Runnable {

private String tableName;//表名
private List<String> columnsTitle;//标题
private ExcelRead er;//自己写的excel对象
private boolean flag;

public saveDataClass(String tableName, List<String> columnsTitle,
ExcelRead er) {
this.tableName = tableName;
this.columnsTitle = columnsTitle;
this.er = er;
this.flag = false;
}

@Override
public void run() {
int start = 1;
int size = 900;
int sheetRowNum = er.getRowNum();//页的行数

int count = sheetRowNum / 900;
if (sheetRowNum % 900 > 0) {
count++;
}
for (int i = 0; i < count; i++) {
int end = start + size;
List<String[]> list = er.readExcelByRowAndDelete(start, end);//获取一段excel中的数据
Thread thread = new Thread(new MyThread(columnsTitle, list, tableName));//开始存数据
thread.start();
start = end;
while(!flag) {
//logger.debug("");这里就有问题,加上打印语句就可以,不加就不行
}
addFlag(false);
}
}

public synchronized void addFlag(boolean flag) {
this.flag = flag;
}

/**
* 进行数据插入的并发类
* @implements Runnable
* @author zcx
*
*/
class MyThread implements Runnable {

List<String> columns;
List<String[]> data;
String tableName;

public MyThread(List<String> columns, List<String[]> data,
String tableName) {
this.columns = columns;
this.data = data;
this.tableName = tableName;
}

@Override
public void run() {
/**
* 数据存入数据库
**/
addFlag(true);
}

}

}
...全文
990 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2018-05-15
  • 打赏
  • 举报
回复
private volatile boolean flag;
  • 打赏
  • 举报
回复
引用 1 楼 weixin_39309867 的回复:
不管加不加打印,你的while(!flag);和while(!flag){};里面是空的啊,就是循环也看不到,你加上了打印语句,你才能在后台看到啊
但是我里面什么都不加经过同样的时间还是只有900条,也就是之循环了一次。而加了却可以全部完成
诺丽果 2018-05-15
  • 打赏
  • 举报
回复
不管加不加打印,你的while(!flag);和while(!flag){};里面是空的啊,就是循环也看不到,你加上了打印语句,你才能在后台看到啊

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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