我有一个要求,我必须从csv处理大量的ID, 我正在使用threadpoolexecutor来做这件事。
callRunnable cn=null;
Iterator it=crmCSVReader.iterator();
cn= new callRunnable(it);
BlockingQueue execQ= new LinkedBlockingDeque();
execQ.add(cn);
ThreadPoolExecutor exec= new ThreadPoolExecutor(2, 6, 5, TimeUnit.SECONDS, execQ);
并且在callRunnable.java中我实现了run方法,该方法在callRunnable构造函数中初始化了这个迭代器实例。
public void run()
{
if(it.hasNext())
{
csv=(CRMDataCSVModel)it.next();
try {
linenum++;
log.info("Processing line number : [" + linenum
+ "] and inputid : [" + csv.getInputid() + "]");
System.out.println("Processing line number : [" + linenum
+ "] and inputid : [" + csv.getInputid() + "] at time : " + Calendar.getInstance().getTime());
MainClient.callPersist(csv.getInputid(), linenum);
} catch (Exception e) {
//log.error("Error in processing record for inputID", e);
}
}
但问题是迭代器只读一次。然后就会卡住。
Processing line number : [1] and inputid : [1067490351093320130621041031] at time : Thu Mar 26 06:50:44 IST 2015
Calling save to db ----calling thread--pool-1-thread-2
我认为这可能是因为多线程无法同时处理迭代器。 如果是这样,那么可能是其他替代方案,我的意思是我可以替换这个迭代器实例。
问候
Jayendra
答案 0 :(得分:0)
它因为你实际上没有移动到下一条记录而陷入困境。你需要使用while / for循环来迭代迭代器上的记录。 此外,您可能希望迭代执行程序代码并将CSV模型对象传递给可运行的进一步处理。 希望它有所帮助。