【问题标题】:Java ExecutorService Implementation AssistanceJava ExecutorService 实施协助
【发布时间】:2012-08-31 09:26:29
【问题描述】:

在以下代码中,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
    }
}

【问题讨论】:

  • ExecutorService 可以提供帮助。到目前为止你尝试过什么?

标签: java multithreading arraylist executorservice


【解决方案1】:

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

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

【讨论】:

  • 不要索引List!如果底层实现是LinkedList,性能将是可怕的!你也应该在awaitTermination之前打电话给shutdown
  • 糟糕,我刚刚从问题中复制粘贴了部分方法))主要思想是在循环内提​​交新线程。附:固定
  • @stemm,非常感谢。难道我们不需要在类中实现 Runnable 吗?
  • @user1651714,具有方法“sendEmail”的类不必实现Runnable。在我的代码中——我使用了匿名类:new Runnable{ public void run(){...} }——在这种情况下就足够了。只需将匿名类添加到方法run() 逻辑,您希望异步执行(在我的示例中-调用方法sendMailTo(..)
【解决方案2】:

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

ExecutorService executorService = Executors.newSingleThreadExecutor();

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

executorService.shutdown();

信息

  • 您可以找到它的 java doc here
  • here 提供有关ExecutorService 的更详细教程。

【讨论】:

  • @mtk 非常感谢。我正在尝试实现 executorService。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 2012-05-28
相关资源
最近更新 更多