同步java类的run方法

同步java类的run方法,java,multithreading,Java,Multithreading,我在下面有一段代码,其中创建了5个不同的线程,然后调用了相应的run方法,请告知我如何在其中添加同步,因为我想当一个线程调用run方法时,其他线程不应进入run方法内部 public class SSendEmail implements Runnable { public static void main(String [] args) throws Exception, IOException, Exception{ for(int i=0;i<5;i++) {

我在下面有一段代码,其中创建了5个不同的线程,然后调用了相应的run方法,请告知我如何在其中添加同步,因为我想当一个线程调用run方法时,其他线程不应进入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[] = {"sart@wer.com" };
    String mailCc[] = {"sart@wer.com" };

    xxsendmail(mailTo, mailCc, "sendername",
            "testsubject.", "testsubject..", smtpHost , mailSmtpPort);
  }  
}
公共类SSendEmail实现可运行{
公共静态void main(字符串[]args)引发异常、IOException、异常{

对于(int i=0;i产生5个必须同步其运行方法的线程是没有意义的。为什么不按顺序运行它们呢?但是,如果您仍然想这样做,一种方法是将对象的同一实例传递给SSendMail,并在运行方法中对该对象进行同步。即,在for循环之前创建一个对象,并将其传递给SSendMail constructor。

同步运行方法,以防止其他线程进入运行方法,如下所示

公共类SSendEmail实现可运行{

公共静态void main(字符串[]args)引发异常、IOException、异常{

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


顺便说一句,我想知道你为什么要阻止其他线程进入上述运行方法。

你可以使用
synchronized(X.class)
synchronized(this)
synchronized(X.class)
用于确保块中只有一个线程,并且
synchronized(this)
块由实例保护。对于每个实例,只有一个线程可以进入块。此外,您必须根据需要使用适当的
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[] = {"sart@wer.com" };
          String mailCc[] = {"sart@wer.com" };

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

    }
公共类SSendEmail实现可运行{
公共静态void main(字符串[]args)引发异常、IOException、异常{

对于(int i=0;i为什么要将线程添加到一个要严格线性化的进程中?那么为什么需要线程呢?注意:这与您之前的问题相反。您对这个问题的想法是什么?这不会阻止5个单独的SSendMail实例并行运行。感谢您让我知道这一点,这是否意味着synchronized关键字在运行方法上不起作用?不,它在运行方法上起作用。我刚刚看到您将创建SSendMail实例移动到循环之外,并且只创建一个实例,我的坏。这将对起作用。感谢完美的解释,请您也展示如何在其中添加等待和通知,这将非常好理解,提前感谢E
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[] = {"sart@wer.com" };
          String mailCc[] = {"sart@wer.com" };

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

    }