2013-02-22 7 views
0

У меня есть следующий кодThreadPoolExecutor Реализация для метода с ArrayList Параметр

private List<String[]> userList2 = new ArrayList<String[]>(10000); 

ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 10, TimeUnit.SECONDS, 
new ArrayBlockingQueue<Runnable>(5), new ThreadPoolExecutor.CallerRunsPolicy()); 

Query Database

while (rs.next()) 
{ 
      data = new String[2]; 
      data[0] = rs.getString("userid"); 
      data[1] = rs.getString("email"); 
      userList2.add(data); 

      if(userList2.size()==10000) //Confusion in this part.. 
      { 

      final List<String[]> elist = new ArrayList<String[]>(userList2); 
      executor.execute(new Runnable() { 
       public void run() { 

       doBilling(con,elist); //Parallel is not happening here... 

      } 
      }); 

У меня есть метод

doBillng(Connection con,List<String[]> userList) 
{ 

String list[]=null; 
String userid=" "; 
for(int i=0;i<userList.size();i++) 
    { 
     list=userList.get(i); 
     userid=props[0]; 
     list = BillingDao.billById(uid, con); 

    } 
} 

Когда userlist2 размер 10000 Я хочу run doBilling в 10 потоках параллельно, чтобы он мог достичь 10000 записей с большой скоростью. Но этого не происходит !!! Пожалуйста, предложите что я делаю не так и как это должно быть решено ..

Заранее спасибо

ответ

0

Вы представили только одну задачу в executor и что происходит, когда if(userList2.size()==10000) возвращается true. Поэтому, следовательно, у вас есть одинThread работает для обработки 10000 элементов ArrayList !!!!!.

Если вы хотите 10 потоков для выполнения 10000 элементов ArrayList код должен быть что-то вроде этого:

while (rs.next()) 
{ 
    data = new String[2]; 
    data[0] = rs.getString("userid"); 
    data[1] = rs.getString("email"); 
    userList2.add(data); 
    if(userList2.size()% 1000 == 0) //Check if size is multiple of 1000(obtained by 10000/10) 
    { 
     final List<String[]> elist = new ArrayList<String[]>(userList2); 
     executor.execute(new Runnable() 
     { 
      public void run() 
      { 
       doBilling(con,elist); //create new ArrayList and assign it to a seperate thread. 
      } 
     }); 
     userList2.clear();//clearing the arrayList so that next time when submitted to executor , new elements are processed. 
    } 
} 
+0

Так что я должен использовать цикл внутри метода выполнения ?? –

+0

@MadanMadan см. Мое обновление –

+0

@Vishal .. Большое спасибо .. Итак, по вашему коду elist это новый ArrayList, который назначается каждому отдельному потоку и с помощью userList2.size()% 1000 == 0 сможет параллельно запускать doBilling метод ... который запускает 1000 в каждом потоке .. ?? Не так ли? –

Смежные вопросы