0

我正在执行一项任务,其中我有一个类说它Email包含一个包含所有要发送的电子邮件的 LinkedList。我有几个课程向这个队列添加了一封电子邮件。

现在,我想要的是,Email只要在 LinkedList 对象中添加一个元素,类就会自动启动一个线程,直到所有电子邮件都发送完毕。我可以对这个实现有一些指导吗?

4

4 回答 4

2

替换LinkedList<Email>LinkedBlockingDequeue<Email>,立即启动您的线程,并将其传递给队列。该线程应该调用queue.take(),这将阻塞直到电子邮件可用。本质上,您将在队列的接收端等待一个休眠线程,从而产生您想要的效果:任何时候将一封电子邮件插入队列,阅读线程就会唤醒,获取新的电子邮件,处理它,然后继续睡觉。

于 2013-05-12T10:20:20.500 回答
1

使用 BlockingQueue 作为列表。把线挂在上面。线程围绕队列 take() 调用循环,当获取一个 Email 实例时,发送它然后返回到队列。

于 2013-05-12T10:18:18.570 回答
1

我建议您编写一个使用 ExecutorService 而不是队列来提交任务以发送电子邮件的 EmailSender 类。

传递一个有副作用的集合是个坏主意。例如,如果调用者调用会发生什么

  • addAll() - 添加多封电子邮件?
  • remove() - 取消已添加队列的电子邮件?
  • retainAll() - 取消除列出的电子邮件之外的所有电子邮件?
  • clear() - 取消所有邮件?

您正在公开各种可能无法实现或没有意义的功能。

于 2013-05-12T11:04:40.603 回答
0

您应该在类中实现一个方法(例如),并让其他类调用该方法并将新电子邮件作为参数传递,而不是让您提到的几个类中的每一个都直接向Email's添加元素。 在这种方法中,您可以将新电子邮件添加到(可能在检查它不在列表中之后)并启动您想要自动启动的线程。LinkedListpublic void addEmail(...)Email
addEmailLinkedList

于 2013-05-12T10:20:06.483 回答