同步java类的run方法



我下面有一段代码,其中创建了5个不同的线程,然后相应地调用运行方法,请建议我如何根据需要在其中添加同步。当一个线程调用运行方法时,其他线程不应进入运行方法

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);
  }  
}

生成5个必须同步其运行方法的线程是没有意义的。为什么不按顺序运行呢?但是,如果您仍然想这样做,一种方法是将对象的同一实例传递给SSendMail,并在您的run方法中对该对象进行同步。即在for循环之前创建一个对象,并将其传递给SSendMail构造函数。

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

公共类SSendEmail实现Runnable{

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

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

}

公共同步的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);

}
}

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

您可以使用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);
      }  
    }

参考文献1参考文献2

等待()和通知()

比方说,在对方法采取操作之前,是否有一些条件需要匹配。根据您的示例,您正在发送电子邮件,但在某些情况下,会有空的电子邮件数组,因此如果数组为空,您的一些线程将失败。因此,在这种情况下,您可以使用wait()notify()

wait():在满足特定条件之前,正在运行的线程将被阻止。notify():通知被阻止的线程重新运行。此外,您还可以使用notifyAll()来了解多个线程。

最新更新