我从数据库中检索了 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
}
}
提前致谢。
最佳答案
有一种更简单的方法:生产者-消费者。将所有项目保留在单个列表中,并定义封装数据项的处理任务:
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);
现在您有了并行执行和负载平衡(!!!),因为线程在完成之前的任务时按需执行工作。通过将数组分割成连续的部分,您就没有这种保证。
关于Java多线程: How to use multi-threading in different ArrayList containing record info?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12298452/