java.lang.Thread.State:阻塞(在对象监视器上)
我的线程转储中有太多处于阻止状态的线程。这使我的应用程序没有响应。当我查看代码时,我发现函数是同步的,因为哪个线程处于阻止状态。如果此方法没有同步,那么多个线程同时访问同一方法将导致类似于一封邮件的问题线程干扰另一个线程。如何以一种应用程序不必遭受损失的方式更改代码。这是我的密码- //邮件传输类java.lang.Thread.State:阻塞(在对象监视器上),java,multithreading,synchronization,Java,Multithreading,Synchronization,我的线程转储中有太多处于阻止状态的线程。这使我的应用程序没有响应。当我查看代码时,我发现函数是同步的,因为哪个线程处于阻止状态。如果此方法没有同步,那么多个线程同时访问同一方法将导致类似于一封邮件的问题线程干扰另一个线程。如何以一种应用程序不必遭受损失的方式更改代码。这是我的密码- //邮件传输类 public final boolean openConnection() throws MailingException { boolean flag = false; if (t
public final boolean openConnection() throws MailingException {
boolean flag = false;
if (transport == null) {
mailsession = MailSession.getMailSession();
try {
transport = (SMTPTransport) mailsession.getNewTransport();
flag = true;
// System.out.println("\n--MailTransport.java ------------ Connection is SUccessful -- "+transport.isConnected());
} catch (MailingException mex) {
setStatusmessage(new StringBuffer(statusMessages[1]).append(
" -- ").append(mailsession.getSmtphost()).append(
"<BR> Contact").append(
"<A HREF=\"mailto:" + returnPath + "\">").append(
"Administrator").append("</A>").toString());
throw mex;
}
} else {
flag = true;
}
return flag;
}
这是我的线程转储的一部分-
at javax.mail.Service.connect(Service.java:275)
at javax.mail.Service.connect(Service.java:156)
at com.appnetix.app.util.mail.MailSession.getNewTransport(MailSession.java:199)
at com.appnetix.app.util.mail.MailSession.getNewTransport(MailSession.java:249)
locked <0x00000007211b9480> (a com.appnetix.app.util.mail.MailSession)
at com.appnetix.app.util.mail.MailTransport.openConnection(MailTransport.java:122)
at com.appnetix.app.util.mail.MailSenderBase.init(MailSenderBase.java:107)
at com.appnetix.app.util.MailSender.sendMail(MailSender.java:193)
at com.appnetix.app.util.MailSender.sendMail(MailSender.java:175)
位于javax.mail.Service.connect(Service.java:275)
在javax.mail.Service.connect(Service.java:156)
位于com.appnetix.app.util.mail.MailSession.getNewTransport(MailSession.java:199)
在com.appnetix.app.util.mail.MailSession.getNewTransport上(MailSession.java:249)
锁定(com.appnetix.app.util.mail.MailSession)
位于com.appnetix.app.util.mail.MailTransport.openConnection(MailTransport.java:122)
在com.appnetix.app.util.mail.MailSenderBase.init(MailSenderBase.java:107)上
位于com.appnetix.app.util.MailSender.sendMail(mailssender.java:193)
位于com.appnetix.app.util.MailSender.sendMail(mailssender.java:175)
以下是一些提示:
不要在主线程上发送电子邮件。创建处理电子邮件的线程池。这是很有用的,因为一般来说,您不需要等待电子邮件成功发送来回答调用方法。这足以说明我已经收到了你的电子邮件,我会尽快(异步)发送它
是否确实需要同步getNewTransport
?
尝试重写方法
getNewTransport
,以返回新的Transport
,而不使用可变实例变量。这样做可以避免使用synchronized
删除可变实例变量将如何帮助使其不同步并正常工作?代码只需同步以访问可由多个线程更改的变量。如果有单线程应用程序,则不需要同步。如果您有一个多线程应用程序,但共享变量是不可修改的,则不需要同步。
at javax.mail.Service.connect(Service.java:275)
at javax.mail.Service.connect(Service.java:156)
at com.appnetix.app.util.mail.MailSession.getNewTransport(MailSession.java:199)
at com.appnetix.app.util.mail.MailSession.getNewTransport(MailSession.java:249)
locked <0x00000007211b9480> (a com.appnetix.app.util.mail.MailSession)
at com.appnetix.app.util.mail.MailTransport.openConnection(MailTransport.java:122)
at com.appnetix.app.util.mail.MailSenderBase.init(MailSenderBase.java:107)
at com.appnetix.app.util.MailSender.sendMail(MailSender.java:193)
at com.appnetix.app.util.MailSender.sendMail(MailSender.java:175)