Java服务实现协助

Java服务实现协助,java,multithreading,arraylist,executorservice,Java,Multithreading,Arraylist,Executorservice,在下面的代码中,userList获取大量数据,这是因为发送电子邮件花费的时间太长 如何提高应用程序的速度,使50000封电子邮件发送速度更快?可能使用执行器服务 List<String[]> userList = new ArrayList<String[]>(); void getRecords() { String [] props=null; while (rs.next()) { props = new String[2]; pro

在下面的代码中,
userList
获取大量数据,这是因为发送电子邮件花费的时间太长

如何提高应用程序的速度,使50000封电子邮件发送速度更快?可能使用
执行器服务

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
    }
}
List userList=new ArrayList();
void getRecords(){
字符串[]props=null;
while(rs.next()){
道具=新字符串[2];
props[0]=rs.getString(“用户电子邮件”);
props[1]=rs.getString(“活动”);
添加(道具);
如果(userList.size()>0)sendmail();
}
void sendmail(){
字符串[]user=null;

对于(int k=0;k您可以使用
ExecutorService
执行以下任务:

ExecutorService executorService = Executors.newSingleThreadExecutor();

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

executorService.shutdown();
信息
  • 你可以找到它的java文档
  • 有关
    ExecutorService
    的更详细教程可用

您可以使用
ExecutorService
执行以下任务:

ExecutorService executorService = Executors.newSingleThreadExecutor();

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

executorService.shutdown();
信息
  • 你可以找到它的java文档
  • 有关
    ExecutorService
    的更详细教程可用

尝试以以下方式并行化代码:

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
必须是无状态的。

请尝试以以下方式并行化您的代码:

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
必须是无状态的。

ExecutorService可能会有帮助。到目前为止您尝试了什么?ExecutorService可能会有帮助。到目前为止您尝试了什么?不要为
列表
编制索引!如果底层实现是
链接列表
,那么性能将非常糟糕ble!您还应该在
等待终止之前调用
shutdown
)主要思想是在loop.P.S中提交新线程。fixed@stemm,非常感谢。我们不需要在类中实现Runnable吗?@user1651714,方法为“sendmail”的类不需要实现
Runnable
。在我的代码中,我使用了匿名类:
newrunnable{public void run(){…}
-在这种情况下就足够了。只需将匿名类添加到方法
run()
逻辑中,您希望异步执行它(在我的示例中,调用方法
sendMailTo(…)
)不要索引
列表
!如果底层实现是
链接列表
,那么性能会很糟糕!而且你应该在
等待终止
之前调用
关闭
。哎呀,我刚才复制了问题中粘贴的部分方法。)主要思想是在loop.P.S中提交新线程。fixed@stemm谢谢很多。我们不需要在类中实现Runnable吗?@user1651714,使用方法“sendmail”的类不需要实现
Runnable
。在我的代码中-我使用了匿名类:
newrunnable{public void run(){…}}
-在这种情况下就足够了。只需将匿名类添加到方法
run()
逻辑,您希望异步执行它(在我的示例中-调用方法
sendMailTo(…)
)@mtk非常感谢。我正在尝试实现executorService。@mtk非常感谢。我正在尝试实现executorService。