【发布时间】:2015-05-29 22:35:14
【问题描述】:
我有一个要求,我必须处理来自 csv 的大量 id, 我正在使用线程池执行器来执行此操作。
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
我认为这可能是因为迭代器不能由多个线程同时处理。 如果是这样,还有什么其他选择,我的意思是我可以用谁替换这个迭代器实例。
问候
贾延德拉
【问题讨论】:
-
如何迭代threadexecutor代码本身并将CRMDataCSVModel传递给callrunnable!
-
顺便说一句,它被卡住了,因为你实际上并没有移动到下一条记录。你需要使用 while/for 循环在迭代器上迭代记录。
标签: java multithreading threadpool threadpoolexecutor