如何使用多线程处理多个ID

时间:2015-03-26 01:23:42

标签: java multithreading threadpool threadpoolexecutor

我有一个要求,我必须从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

1 个答案:

答案 0 :(得分:0)

它因为你实际上没有移动到下一条记录而陷入困境。你需要使用while / for循环来迭代迭代器上的记录。 此外,您可能希望迭代执行程序代码并将CSV模型对象传递给可运行的进一步处理。 希望它有所帮助。