現在の Java 演習では、2 つの異なる Gmail アカウントからメールを取得する必要があります。gmail クラスの新しいインスタンスを作成することでこれを行いました。gmail クラスはスレッドを拡張し、その中にメールを取得して印刷する同期メソッド readMail() があります。この readMail メソッドは run メソッドによって while(true) ループで呼び出され、その後 30 秒間スリープします。これは、30 秒ごとにメールを取得するという考え方です。ただし、同期方法は機能しないようです。スレッドは互いに割り込み、他のスレッドが割り込みをかけて印刷を開始する前に、メソッドはメッセージのすべての項目を印刷しません。
アドバイスをいただければ幸いです。
問題を引き起こしている以下の方法を参照してください。
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();
}
}
}
}