0

このメソッドをバックグラウンドで個別に実行したいので、スレッドで呼び出したい次のメソッドがあります。

EmailNotification私はクラスで次の機能を持っています

public class EmailNotification {
public void SendEmailNotificationForCampaign(String[] pCamp_ids,
            List<String> pReciepientAddresses, campaign pCampObj,
            ThemeDisplay pThemeDisplay, OPERATION pOperation,
            List<String> pSmptpObjList, String pLogoPath) {

        GenerateCampaignEmailMessage(pCamp_ids, pReciepientAddresses, pCampObj,
                pThemeDisplay, pOperation, pSmptpObjList, pLogoPath);
    }
}

以下は、上記のメソッドを呼び出している RestaurantPortlet クラスのコードです。

EmailNotification emailnotifyObj = new EmailNotification();
                            emailnotifyObj.SendEmailNotificationForAdvertise(sAdvIds,
                                    RecipientAdress, updatedAdv, pthemeDisplay,
                                    OPERATION.AD_DELETE, ReadSmtpDataForMailNotification(), pthemeDisplay.getPortalURL()+"/eMenuAdvertise-portlet/img/eMenuLogo.png");

では、スレッドで SendEmailNotificationForCampaign メソッドを実装するにはどうすればよいですか?誰でもガイドできますか?私はスレッドの概念が初めてです。

4

4 に答える 4

1

内部に ExecutorService を含むサービスを作成し、メール送信タスクを executor サービスに渡します。漠然と:

class EmailService {
   private ExecutorService executor;

   public sendMail(arguments) {
      executor.submit(new Runnable() {
         //send mail with given parameters
      }
   }
}

このようにして、バックグラウンドで実行されているスレッドのハンドルを取得し、必要に応じてシャットダウンできます (実行時間が長すぎるなど)。同時に開始するスレッドが多すぎると、新しいスレッドを開始するだけでアプリが強制終了される可能性があります。

チュートリアルを見てみよう

于 2013-01-18T08:54:34.500 に答える
1

最も単純でおそらく最良のアイデアは、保留中のすべての電子メールに対して静的キューを作成することです。すべてのプロデューサー スレッドがメールをキューに追加し、他のスレッドがこれらのメールを処理して送信します。

ウィキで生産者/消費者の問題を見てください。それはあなたにそれを行う方法についてかなり良い考えを与えるでしょう.

于 2013-01-18T08:47:26.620 に答える
1

あなたの質問に対する短い答えは次のとおりです。

Runnable task = new Runnable () {
    public void run() {
        //your code here, for example:
        EmailNotification emailnotifyObj = new EmailNotification();
        emailnotifyObj.SendEmailNotificationForAdvertise(sAdvIds,
                                RecipientAdress, updatedAdv, pthemeDisplay,
                                OPERATION.AD_DELETE, ReadSmtpDataForMailNotification(), pthemeDisplay.getPortalURL()+"/eMenuAdvertise-portlet/img/eMenuLogo.png");
    }
}

new Thread(task).start();

ご了承ください:

  • これは、何が機能するかに応じて、期待どおりに機能するかどうかに依存GenerateCampaignEmailMessageします。特に、コードの残りの部分からもアクセスする変数にアクセスする場合は、それらのアクセスを適切に同期する必要があります。
  • 多くの電子メールを送信する場合、電子メールごとに 1 つのスレッドを作成するのではなく、代わりにスレッド プールを使用する必要があります。
于 2013-01-18T08:47:44.170 に答える
1

私によると、提案はJMSのようなスレッド以外を使用して、Javaメールを使用してメッセージを送信することです。

Thread でメールを送信したい場合は、TimerTask を使用することもできます。

単一のメソッドを同期可能にするために、他のオプションではなくスレッドのみが必要な場合。

リンクをチェック

public synchoronized setCount(int count){
   this.count = count;
}
于 2013-01-18T08:48:41.167 に答える