对于我当前的 java 练习,我必须从 2 个不同的 Gmail 帐户获取邮件。我通过创建 Gmail 类的新实例来完成此操作。 gmail 类扩展了线程,其中有一个同步方法 readMail(),用于获取邮件并打印它。这个 readMail 方法由 run 方法在 while(true) 循环中调用,然后它会休眠 30 秒,其想法是每 30 秒获取一次邮件。但是,synchronized方法似乎不起作用。线程相互中断,并且在另一个线程中断并开始打印之前,该方法不会打印消息的所有项目。
任何建议将不胜感激。
请参阅下面给我带来麻烦的方法:
public synchronized void readMail() throws MessagingException, IOException {
Folder inbox = store.getFolder("Inbox");
inbox.open(Folder.READ_ONLY);
messages = inbox.getMessages();
// System.out.println("No of Messages : " + inbox.getMessageCount());
// System.out.println("No of Unread Messages : "
// + inbox.getUnreadMessageCount());
for (int i = 0; i < inbox.getUnreadMessageCount(); i++) {
System.out
.println("*****************************************************************************");
System.out.println("NEW MESSAGE " + (i + 1) + ":");
msg = messages[i];
// System.out.println(msg.getMessageNumber());
// Object String;
// System.out.println(folder.getUID(msg)
String subject = msg.getSubject();
System.out.println("Subject: " + subject);
System.out.println("From: " + msg.getFrom()[0]);
System.out.println("To: " + msg.getAllRecipients()[0]);
System.out.println("Date: " + msg.getReceivedDate());
System.out.println("Size: " + msg.getSize());
// System.out.println(msg.getFlags());
// System.out.println("Body: \n"+ msg.getContent());
// System.out.println(msg.getContentType());
}
}
然后是运行方法:
public void run() {
while (true) {
try {
readMail();
} catch (MessagingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
您应该在两个线程都可以访问的对象上同步您的方法,因为现在您正在使用您所在的对象实例来同步,其中的原因永远不会产生影响,因为据我所知,两个线程仅停留在其范围内你的问题。您可以在创建时将一个简单的对象传递给两个线程,并像这样重新格式化您的方法
传递对象进行同步:
public static void main(String[] args){
Object obj = new Object();
gmail g1 = new gmail(obj);
gmail g2 = new gemail(obj);
// more code
}
在 gmail 类中保存引用:
public class gmail extends Thread{
private Object sharedObject;
public gmail( Object synchronizer){
sharedObject = synchronzier;
}
对其进行同步:
public void readMail(){
synchronized( sharedObject ){
// your method code goes here
}
}
对于此示例,同步 gmail 的类对象也是可能的,而且更容易
public void readMail(){
synchronized( this.getClass() ){
// your method code goes here
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)