0

我从数据库中检索了 50000 个数据并将它们存储到 arraylist。我将arraylist分成两半,说250000存储在ArrayList1(偶数行)和其他25000 ArrayList2(奇数行)中。

现在,我需要使用多线程来处理这些,以便一次处理所有 50,000 条记录。主要目的是加快交易速度。

问题是userList变得太重并且需要时间。

如何实现 ExecutorService 以加快速度?

希望尽快收到您的建议。

List<String[]> userList = new ArrayList<String[]>();
void getRecords()
{
    String [] props=null;
    while (rs.next()) {
        props = new String[2];
        props[0] = rs.getString("useremail");
        props[1] = rs.getString("active");
        userList.add(props);
        if (userList.size()>0) sendEmail();   
    }
}

void sendEmail()
{
    String [] user=null;
    for (int k=0; k<userList.size(); k++) 
    { 
        user = userList.get(k);
        userEmail = user[0];         
        //send email code
    }
}

提前致谢。

4

4 回答 4

2

我会为每个线程创建一个 ArrayList。这样每个线程只读取一个列表,您不会遇到多线程问题。

ExecutorService service = ...


List<Work> workList = ...

int blockSize = (workList.size() + threads - 1)/threads;
for(int i = 0; i < threads;i ++) {
   int start = i * blockSize;
   int end = Math.min((i + 1) * blockSize, workList.size());
   final List<Work> someWork = work.subList(start, end);
   service.submit(new Runnable() {
       public void run() {
           process(someWork);
       }
   });
}

您可以使用任意数量的线程,但我建议使用最小的线程数,这样可以提高性能。

于 2012-09-06T10:52:52.240 回答
2

有一种更简单的方法:生产者-消费者。将所有项目保留在一个列表中,并定义一个封装数据项的处理任务:

class Task implements Runnable {
     private Object data;

     public Task(Object data) {
         this.data = data;
     }

     public void run() {
        // process data
     }
}

创建一个线程池并将任务一一提供给它:

ExecutorService exec = Executors.newFixedThreadPool(4); // 4 threads
for(Object obj: itemList) {
    exec.submit(new Task(obj));
}

exec.shutdown();
exec.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

现在您有了并行执行和负载平衡 (!!!),因为线程在完成之前的任务时按需执行工作。通过将数组拆分为连续的部分,您没有此保证。

于 2012-09-06T10:56:54.543 回答
0

我不知道您为什么将列表分成两个列表。为什么不将它们合二为一,并运行两个线程——一个处理偶数行,一个处理奇数行?

无论如何,请查看Java Executor框架。它允许您轻松编写作业并提交它们以供运行(使用线程池、调度它们等)。鉴于执行程序框架可以处理任意数量的线程,我会更智能地拆分您的工作负载(可能分成“n”个元素的子列表)并确定(通过更改作业/线程的数量)在您的特定场景中哪个配置运行速度最快.

于 2012-09-06T10:52:42.653 回答
0

我会使用 aQueue而不是 a List,可能是 a ConcurrentLinkedQueue。这应该是线程安全的,因此允许来自不同线程的并发访问。

于 2012-09-06T10:57:40.457 回答