gpt4 book ai didi

java - 等待另一个线程中的邮件发送完成

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:23:49 24 4
gpt4 key购买 nike

我遇到了一个我无法真正解决的问题。我有我的主线程,我想在其中

  1. 发送带附件的电子邮件
  2. 删除附加的文件

按照这个顺序。我的问题是我正在使用我无法控制的电子邮件助手,它会生成另一个执行发送的线程。因此,我的文件在完成附加之前被删除,并且我在邮件程序中收到 FNF 错误。我正在寻找一种方法让我的主线程等待文件附加完成。我不知道那需要多长时间。我无法控制其他线程的创建,所以我不能使用 join()。有没有什么我可以与 Transport 一起使用的东西,或者有什么方法可以等待方法/类中创建的所有线程停止?

我的程序布局是

//do stuff
MailHelper.sendMail(...); //thread is created somewhere in this method
deleteFiles(); //this happens before sendMail is finished!

我需要使用 Java 6。最坏的情况是我可以让我的主线程 hibernate 几秒钟,但这是不理想的。感谢任何帮助

最佳答案

这是一个有趣的问题!基本上,您想等待所有子线程完成,但无法控制它们。

这是使用 ThreadGroup 的技术演示:

假设您有一个像这样的 MailHelper 类:

public class MailHelper {

public void sendMail(){
Thread t = new Thread(new Runnable() {

@Override
public void run() {
System.out.println("MailHelper: Sending mail for 6s");
for(int i = 0; i < 6; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(".");
}
System.out.println("MailHelper: Sent mail!");
}
});
t.start();
}

}

然后我们的 Main 类演示了如何使用它:

public class Main {

public static void main(String[] args) throws InterruptedException {
final MailHelper mh = new MailHelper();

ThreadGroup mailThreadGroup = new ThreadGroup("mailGroup");
Thread callSendmailThread = new Thread(mailThreadGroup, new Runnable() {

@Override
public void run() {
System.out.println("Calling sendMail().");
mh.sendMail();
System.out.println("sendMail() returned.");
}
});
callSendmailThread.start();
callSendmailThread.join();
System.out.println("callSendmailThread joined. Waiting for rest of ThreadGroup to finish.");

// We cannot rely on ThreadGroup.activeCount() to give us an accurate number, and it could be zero!
Thread[] mailThreads = new Thread[mailThreadGroup.activeCount() + 1];
//Therefore retry enumerate until our array was large enough to hold all
while ( mailThreadGroup.enumerate( mailThreads, true ) == mailThreads.length ) {
mailThreads = new Thread[ mailThreads.length * 2 ];
}

for(Thread t : mailThreads){
if(t != null && t.isAlive()){
System.out.println("Joining thread " + t.getName());
t.join();
System.out.println("Thread " + t.getName() + " joined.");
}
}
mailThreadGroup.destroy();
System.out.println("Done!");

}
}

输出:

Calling sendMail().
sendMail() returned.
callSendmailThread joined. Waiting for rest of ThreadGroup to finish.
Joining thread Thread-1
MailHelper: Sending mail for 6s
.
.
.
.
.
.
MailHelper: Sent mail!
Thread Thread-1 joined.
Done!

请注意,您必须确保在您枚举ThreadGroup 时Thread-1 确实已启动,因此加入callSendMailThread 是绝对有必要。否则你会得到一个竞争条件。

另请注意 quirky behaviour ThreadGroup.enumerate() 必须通过多次重试枚举所有项目来解决。

关于java - 等待另一个线程中的邮件发送完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25063653/

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