【问题标题】:how to use multithreading to process multiple ids如何使用多线程处理多个id
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我在 if(it.hasNext()) 之前尝试使用 while,它运行良好,但以单线程方式无法达到实际目的。
  • 因为您要传递整个 CSV 并只创建一个线程。如何迭代线程执行程序代码本身并将每个 CRMDataCSVModel 传递给 callrunnable!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2019-02-27
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多