我正在执行一项任务,其中我有一个类说它Email
包含一个包含所有要发送的电子邮件的 LinkedList。我有几个课程向这个队列添加了一封电子邮件。
现在,我想要的是,Email
只要在 LinkedList 对象中添加一个元素,类就会自动启动一个线程,直到所有电子邮件都发送完毕。我可以对这个实现有一些指导吗?
我正在执行一项任务,其中我有一个类说它Email
包含一个包含所有要发送的电子邮件的 LinkedList。我有几个课程向这个队列添加了一封电子邮件。
现在,我想要的是,Email
只要在 LinkedList 对象中添加一个元素,类就会自动启动一个线程,直到所有电子邮件都发送完毕。我可以对这个实现有一些指导吗?
替换LinkedList<Email>
为LinkedBlockingDequeue<Email>
,立即启动您的线程,并将其传递给队列。该线程应该调用queue.take()
,这将阻塞直到电子邮件可用。本质上,您将在队列的接收端等待一个休眠线程,从而产生您想要的效果:任何时候将一封电子邮件插入队列,阅读线程就会唤醒,获取新的电子邮件,处理它,然后继续睡觉。
使用 BlockingQueue 作为列表。把线挂在上面。线程围绕队列 take() 调用循环,当获取一个 Email 实例时,发送它然后返回到队列。
我建议您编写一个使用 ExecutorService 而不是队列来提交任务以发送电子邮件的 EmailSender 类。
传递一个有副作用的集合是个坏主意。例如,如果调用者调用会发生什么
您正在公开各种可能无法实现或没有意义的功能。
您应该在类中实现一个方法(例如),并让其他类调用该方法并将新电子邮件作为参数传递,而不是让您提到的几个类中的每一个都直接向Email
's添加元素。
在这种方法中,您可以将新电子邮件添加到(可能在检查它不在列表中之后)并启动您想要自动启动的线程。LinkedList
public void addEmail(...)
Email
addEmail
LinkedList