4

以下は、スレッドを使用する私のコードの一部です。目的は、データベースからすべてのレコード (約 5,00,000) を取得し、アラート メール メッセージを送信することです。私が直面している問題は、変数 emailRecords が非常に重くなり、電子メール メッセージの送信に時間がかかりすぎることです。5,00,000 レコードが並列処理されるようにマルチスレッドを使用して高速化するにはどうすればよいですか? ExecutorService を使用しようとしましたが、実装に混乱しました。メソッド checkName()、getRecords()、および sendAlert() で混乱しました。これら 3 つの方法はすべて関連して使用されます。では、どこで executorService を使用するのでしょうか??

次のコードの進め方と、編集が必要な部分を教えてください。前もって感謝します!!

public class sampledaemon implements Runnable {

    private static List<String[]> emailRecords = new ArrayList<String[]>();

    public static void main(String[] args) {
        if (args.length != 1) {
            return;
        }

        countryName = args[0];

        try {
            Thread t = null;
            sampledaemon daemon = new sampledaemon();
            t = new Thread(daemon);
            t.start();
        } catch (Exception e) {
            e.printStackTrace()
        }

    }

    public void run() {
        Thread thisThread = Thread.currentThread();
        try {
            while (true) {
                checkName(countryName);
                Thread.sleep(TimeUnit.SECONDS.toMillis(10));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void checkName(String countryName) throws Exception {
        Country country = CountryPojo.getDetails(countryName)

        if (country != null) {
            getRecords(countryconnection);
        }
    }

    private void getRecords(Country country, Connection con) {
        String users[] = null;
        while (rs.next()) {
            users = new String[2];
            users[0] = rs.getString("userid");
            users[1] = rs.getString("emailAddress");
            emailRecords.add(props);

            if (emailRecords.size() > 0) {
                sendAlert(date, con);
            }
        }
    }

    void sendAlert(String date, Connection con) {
        for (int k = 0; k < emailRecords.size(); k++) {
            //check the emailRecords and send email 
        }
    }
}
4

3 に答える 3

1

を使用する利点は、スレッドを何度も作成するという高価なプロセスを実行する必要がないことFixedThreadPoolです。これは最初に行われます...以下を参照してください..

ExecutorService executor = Executors.newFixedThreadPool(100);

ArrayList<String> arList =  Here your Email addresses from DB will go in ;

for(String s : arList){

     executor.execute(new EmailAlert(s));

 }



public class EmailAlert implements Runnable{

  String addr;

   public EmailAlert(String eAddr){


         this.addr = eAddr;

       }


  public void run(){


     // Do the process of sending the email here..

  }

 }
于 2012-09-06T17:28:42.297 に答える
0

メイン スレッドで同じ作業を行う代わりに、すべての作業を行う 2 番目のスレッドを作成してemailRecordsも、それらのいずれかを処理する前に 500 万件のレコードでリストがいっぱいになるという問題を回避するのには役立ちません。

あなたの目標は、データベースからの読み取りと電子メールの送信を並行して行えるようにすることのようです。コードについて心配する代わりに、まず、達成したい作業のアルゴリズムを考えてください。このようなもの:

  1. 1 つのスレッドで、データベースからレコードを照会し、結果ごとに 1 つのジョブを ExecutorService に追加します。
  2. そのジョブは、1 人の人/アドレス/レコードに電子メールを送信します。

または代わりに

  1. N 個のバッチ (50、100、1000 など) でデータベースからレコードを読み取る
  2. 各バッチを executorService に送信する
于 2012-09-06T17:28:13.670 に答える