我下面有一段代码,其中创建了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()
来了解多个线程。