Java同步方法...未同步

Pro*_*att 2 java synchronized

对于我目前的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());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后运行方法:

    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();
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

小智 5

你应该在两个线程都可以访问的对象上同步你的方法,因为你现在正在使用你所在的对象实例来同步哪个原因永远不会产生影响,因为据我所知,两个线程只保留在它们的范围内你的问题.您可以在创建时将一个简单的Object传递给两个线程,并像这样重新格式化您的方法

传递对象同步:

public static void main(String[] args){
     Object obj = new Object();
     gmail g1 = new gmail(obj);
     gmail g2 = new gemail(obj);
     // more code
}
Run Code Online (Sandbox Code Playgroud)

在gmail类中保存引用:

public class gmail extends Thread{
    private Object sharedObject;

    public gmail( Object synchronizer){
          sharedObject = synchronzier;
    }
Run Code Online (Sandbox Code Playgroud)

同步它:

public void readMail(){
   synchronized( sharedObject ){
       // your method code goes here
   }
}
Run Code Online (Sandbox Code Playgroud)

对于此示例,也可以在gmail的类对象上进行同步,这样更容易

public void readMail(){
   synchronized( this.getClass() ){
       // your method code goes here
   }
}
Run Code Online (Sandbox Code Playgroud)