Java 获取ArrayList参数的方法的ThreadPoolExecutor实现

Java 获取ArrayList参数的方法的ThreadPoolExecutor实现,java,jsp,Java,Jsp,我有以下代码 private List<String[]> userList2 = new ArrayList<String[]>(10000); ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5), new ThreadPoolExecutor.CallerRunsPol

我有以下代码

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

ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 10, TimeUnit.SECONDS, 
new ArrayBlockingQueue<Runnable>(5), new ThreadPoolExecutor.CallerRunsPolicy());
private List userList2=new ArrayList(10000);
ThreadPoolExecutor executor=新的ThreadPoolExecutor(10,10,10,TimeUnit.SECONDS,
新的ArrayBlockingQueue(5),新的ThreadPoolExecutor.CallerRunPolicy();
数据库查询

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... 

            }
            });
while(rs.next())
{
数据=新字符串[2];
数据[0]=rs.getString(“用户ID”);
数据[1]=rs.getString(“电子邮件”);
userList2.add(数据);
if(userList2.size()==10000)//此部分中的混淆。。
{
最终列表elist=新的ArrayList(userList2);
executor.execute(新的Runnable(){
公开募捐{
多比林(con,elist);//这里没有发生类似的事情。。。
}
});
我有办法

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);

    }
}
dobilling(连接con,列表userList)
{
字符串列表[]=null;
字符串userid=“”;

对于(int i=0;i您只向
执行器提交了一个任务,当
if(userList2.size()==10000)
返回
true
时就会发生这种情况。因此,您有一个
线程运行以处理ArrayList的10000个元素

如果希望10个线程执行ArrayList的10000个元素,则代码应如下所示:

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.
    }
}
while(rs.next())
{
数据=新字符串[2];
数据[0]=rs.getString(“用户ID”);
数据[1]=rs.getString(“电子邮件”);
userList2.add(数据);
if(userList2.size()%1000==0)//检查大小是否为1000的倍数(由10000/10获得)
{
最终列表elist=新的ArrayList(userList2);
executor.execute(新的Runnable()
{
公开募捐
{
doBilling(con,elist);//创建新的ArrayList并将其分配给单独的线程。
}
});
userList2.clear();//清除arrayList,以便下次提交给executor时处理新元素。
}
}

那么我必须使用循环内部运行方法吗???@Vishal..非常感谢..因此,根据您的代码,elist是一个新的ArrayList,通过使用userList2.size()分配给每个单独的线程%1000==0将能够并行运行doBilling方法…该方法在每个线程上运行1000…不是吗?是的。它是…但如果任务继续在队列中排队,您的程序仍有可能挂起。但一旦队列满了或corepool线程变为空,新线程将逐个分配给队列中的任务。如果这解决了您的问题。请将答案标记为已接受。通过在我的答案投票号码下方的勾号上单击,您可以知道如何在此处接受答案: