Java的ExecutorService的实施协助 [英] Java ExecutorService Implementation Assistance

查看:109
本文介绍了Java的ExecutorService的实施协助的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在以下code,用户列表获取数据的高容量,由于其发送电子邮件需要很长的时间。

我怎样才能加快,使得50000电子邮件发送更快的应用程序?也许与使用的的ExecutorService

 列表<的String []>用户列表=新的ArrayList<的String []>();
无效getRecords(){
    的String []道具= NULL;
    而(rs.next()){
    道具=新的String [2];
    道具[0] = rs.getString(USEREMAIL);
    道具[1] = rs.getString(活性);
    userList.add(道具);
    如果(userList.size()&0)sendEmail();
}
无效sendEmail(){
    的String []用户= NULL;
    对于(INT K = 0; K< userList.size(); K ++){
        用户= userList.get(K);
        USEREMAIL =用户[0];
        //发送电子邮件code
    }
}


解决方案

尝试并行化code在这样的方式:

 私人最终诠释THREADS_NUM = 20;无效sendEmail()抛出InterruptedException的{
    ExecutorService的执行人= Executors.newFixedThreadPool(THREADS_NUM);
    对于(字符串[]用户:用户列表){
        最后弦乐USEREMAIL =用户[0];
        executor.submit(新的Runnable(){
            @覆盖
            公共无效的run(){
                sendMailTo(USEREMAIL);
            }
        });
    }
    长超时= ...
    的TimeUnit TIMEUNIT = ...
    executor.shutdown();
    executor.awaitTermination(超时,TIMEUNIT);
}无效sendMailTo(字符串USEREMAIL){
// code发送电子邮件
}

此外,请注意,如果你不希望有一个头痛 - 方法 sendMailTo 必须是无状态

In the following code, userList gets high volume of data due to which sending email takes too long time.

How can I speed up the application such that 50000 emails are sent faster? Maybe with the use of an 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
    }
}

解决方案

Try parallelize your code in such way:

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
}

Also, note, if you don't want to have a headache - method sendMailTo must be stateless.

这篇关于Java的ExecutorService的实施协助的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆