2013-05-12 55 views
0

我正在实现一个任务,其中包含一个类0123',其中包含一个LinkedList,其中包含所有要发送的电子邮件。我有几个类添加一个电子邮件到这个队列。将项目添加到java中的列表对象时自动运行线程

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

回答

1

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

传递一个集合,其周围有副作用是一个坏主意。例如如果呼叫者致电

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

您正在公开所有可能未实现或有意义的功能。

+0

可否请您在此上下文中详细阐述'ExecutorService'或者提供一些示例。我之前从未使用过 – Abhi 2013-05-12 11:07:54

+0

2004年,ExecutorService被添加到Java 5.0中,为队列和线程池提供封装。您可以将任务提交给您可以共同或单独控制的线程池。 http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html – 2013-05-12 11:10:07

+1

谢谢你,向我介绍一个新功能。我通过'ExecutorService'而不是队列来实现它。它更简洁,更易于管理 – Abhi 2013-05-13 06:41:10

1

对列表使用BlockingQueue。关闭它的线程。线程绕队列take()调用,当获得一个Email实例时,发送它并返回队列。

0

而不必每次都提到将元素添加到Email“直接小号LinkedList的几类,你应该实现的方法(如public void addEmail(...))在Email类有东星其他类调用该方法,并传递新的电子邮件作为论据。
在这个addEmail方法中,您可以将新电子邮件添加到LinkedList(可能在检查它不在列表中)并启动您想要自动启动的线程。

2

LinkedList<Email>替换为LinkedBlockingDequeue<Email>,立即启动您的线程,并将其传递给队列。该线程应该调用queue.take(),这将阻塞,直到电子邮件变为可用。从本质上讲,你会得到一个等待队列接收端的休眠线程,产生你想要的效果:只要电子邮件插入到队列中,读线程就会醒来,抓住新的电子邮件,处理它,然后回去睡觉。