Java ExecutorService 实现协助

标签 java multithreading arraylist executorservice

在以下代码中,userList 获取大量数据,导致发送电子邮件花费的时间过长。

如何加快应用程序的速度,以便更快地发送 50000 封电子邮件?也许使用 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
    }
}

最佳答案

尝试以这种方式并行化您的代码:

private final int THREADS_NUM = 20;

void sendEmail() throws InterruptedException {
    ExecutorService executor = Executors.newFixedThreadPool( THREADS_NUM );
    for ( String[] user : userList ) { 
        final String userEmail = user[0];         
        executor.submit( new Runnable() {
            @Override
            public void run() {
                sendMailTo( userEmail );
            }
        } );
    }
    long timeout = ...
    TimeUnit timeunit = ...
    executor.shutdown();
    executor.awaitTermination( timeout, timeunit );
}

void sendMailTo( String userEmail ) {
// code for sending e-mail
}

另外,请注意,如果您不想头痛 - 方法 sendMailTo 必须是无状态的。

关于Java ExecutorService 实现协助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12302114/

相关文章:

c++ - Qt QTcpSocket() readReady 信号在多线程服务器应用程序中永远不会触发(插槽从未被调用)。 waitForReadyRead() 方法工作正常

java - Java 中的锯齿状数组 : Converting char[][] and ArrayList<ArrayList<char>>

java - 尝试使用 ArrayList 的方法时出现语法错误?

Java 到 Ruby (Base64/SHA1) 公共(public)摘要生成

java - Eclipse Java 项目 : can I set eclipse to store . 类和 .java 文件在 1 个文件夹中?

C# 从套接字重新读取

c - 在 C 中为线程同步结构

java - 我可以将一组 ArrayList 添加到单个 ArrayList 中吗?

java - 将 Pojo 组件转换为 EJB3

java - 如何触发软键盘?