Java ExecutorService实施帮助

时间:2012-09-06 14:13:35

标签: 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
    }
}

2 个答案:

答案 0 :(得分:3)

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

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必须是无国籍的。

答案 1 :(得分:0)

您可以使用ExecutorService执行此类任务,如下所示:

ExecutorService executorService = Executors.newSingleThreadExecutor();

executorService.execute(new Runnable() {
    public void run() {
        System.out.println("Asynchronous task");
        /* Add your logic here */
    }
});

executorService.shutdown();

INFO

  • 你可以找到它的java doc here
  • 有关ExecutorService的更详细的教程可用here