2016-04-09 3 views
0

5つの異なるスレッドが作成され、それに対応してメソッドが呼び出されている以下のコードがあるので、スレッドを呼び出すときに同期を追加する方法を教えてくださいrunメソッド内に他のスレッドを入れないでください。Javaクラスのrunメソッドを同期させる

public class SSendEmail implements Runnable { 

    public static void main(String [] args) throws Exception, IOException, Exception{ 

     for(int i=0;i<5;i++) { 
      new Thread(new SSendMail()).start(); 
     } 
    } 

    public void run() { 

    String smtpHost = "xxx"; 
    String mailSmtpPort = "000"; 
    String mailTo[] = {"[email protected]" }; 
    String mailCc[] = {"[email protected]" }; 

    xxsendmail(mailTo, mailCc, "sendername", 
      "testsubject.", "testsubject..", smtpHost , mailSmtpPort); 
    } 
} 
+2

厳密に線形にしたいプロセスにスレッドを追加するのはなぜですか? –

+0

そして、どうしてあなたはなぜスレッドを必要としますか? –

+0

注:これは前の質問の反対です。この質問であなたの考えは何ですか? –

答えて

0

runメソッドを同期させる必要がある5つのスレッドを生成することは意味がありません。なぜそれらを順番に実行しないのですか?しかし、それでもやりたいのであれば、1つの方法は、オブジェクトの同じインスタンスをSSendMailに渡して、runメソッドでそのオブジェクトを同期させることです。 forループの前にオブジェクトを作成し、それをSSendMailコンストラクタに渡します。

0

runメソッドを同期させると、他のスレッドがrunメソッドに入るのを防ぐことができます。

パブリッククラスSSendEmailは、例外は、IOException、例外{

SSendMail sendMail = new SSendMail(); 
    for(int i=0;i<5;i++) { 
     new Thread(sendMail).start(); 
    } 

}

公共同期ボイドランを(){Runnableを{

公共の静的な無効メイン(文字列[]引数)を実装スロー

String smtpHost = "xxx"; 
String mailSmtpPort = "000"; 
String mailTo[] = {"[email protected]" }; 
String mailCc[] = {"[email protected]" }; 

xxsendmail(mailTo, mailCc, "sendername", 
     "testsubject.", "testsubject..", smtpHost , mailSmtpPort); 

}
}

私はなぜ、他のスレッドが上記の実行方法に入り込まないようにしたいのでしょうか?

+0

これは、SSendMailの5つの別々のインスタンスが並行して実行されるのを防ぎません。 –

+0

私はこれについて知ってくれてありがとう、同期されたキーワードは、実行メソッドで動作しないことを意味しますか? – prasadr

+0

いいえ、実行メソッドで動作します。 SSendMailのインスタンスをループの外に作成してインスタンスを1つだけ作成することになりました。これはうまくいくでしょう。 –

0

synchronized(X.class)またはsynchronized(this)のいずれかを使用できます。 synchronized(X.class)は、ブロックに正確に1つのスレッドがあり、ブロックがインスタンスによって保護されていることを確認するために使用されます。synchronized(this)すべてのインスタンスに対して、1つのスレッドだけがブロックに入ることができます。また、必要に応じて適切なwait()notify()を使用する必要があります。

public class SSendEmail implements Runnable { 

     public static void main(String [] args) throws Exception, IOException, Exception{ 

      for(int i=0;i<5;i++) { 
       new Thread(new SSendMail()).start(); 
      } 
     } 

     public void run() { 
     synchronized(SSendEmail.class) { 
      String smtpHost = "xxx"; 
      String mailSmtpPort = "000"; 
      String mailTo[] = {"[email protected]" }; 
      String mailCc[] = {"[email protected]" }; 

      xxsendmail(mailTo, mailCc, "sendername", 
       "testsubject.", "testsubject..", smtpHost , mailSmtpPort); 
     } 

    } 

Reference 1Reference 2

wait() and notify()

はあなたが電子メールを送信しているあなたの例にmethod.Accordingに行動をとる前に照合するいくつかの条件がありますが、いくつかの状況が存在する場合としましょうという空の配列の電子メールが存在するので、配列が空の場合にスレッドの一部が失敗する可能性があります。wait()notify()

wait():実行中のスレッドは、特定の条件が満たされるまでブロックされます。 notify():ブロックされたスレッドに再度通知するように通知します。また、notifyAll()を使用して複数のスレッドを知ることができます。

+0

おかげさまで完璧な説明お待ちしておりますので、お待ちしております。お待ちしておりますので、よろしくお願いいたします。 – sss

+0

私はplzを編集しました。 – gihan