同步java类的run方法
我在下面有一段代码,其中创建了5个不同的线程,然后调用了相应的run方法,请告知我如何在其中添加同步,因为我想当一个线程调用run方法时,其他线程不应进入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++) {
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);
}
}