gpt4 book ai didi

Java同步方法...不同步

转载 作者:行者123 更新时间:2023-12-04 20:41:21 24 4
gpt4 key购买 nike

对于我当前的 java 练习,我必须从 2 个不同的 gmail 帐户获取邮件。我通过创建我的 gmail 类的新实例来完成此操作。 gmail 类扩展线程,其中有一个同步方法 readMail(),它获取邮件并打印它。此 readMail 方法由 run 方法在 while(true) 循环中调用,然后它会 hibernate 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
}
}

关于Java同步方法...不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13363952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com