我正在实现一个任务,其中包含一个类0123',其中包含一个LinkedList,其中包含所有要发送的电子邮件。我有几个类添加一个电子邮件到这个队列。将项目添加到java中的列表对象时自动运行线程
现在,我想要的是,类Email
自动启动一个线程,只要一个元素被添加到LinkedList对象中,直到所有的电子邮件都被发送完毕。我能否对此实施有一些指导?
我正在实现一个任务,其中包含一个类0123',其中包含一个LinkedList,其中包含所有要发送的电子邮件。我有几个类添加一个电子邮件到这个队列。将项目添加到java中的列表对象时自动运行线程
现在,我想要的是,类Email
自动启动一个线程,只要一个元素被添加到LinkedList对象中,直到所有的电子邮件都被发送完毕。我能否对此实施有一些指导?
我建议你编写一个EmailSender类,它使用ExecutorService而不是队列来提交发送电子邮件的任务。
传递一个集合,其周围有副作用是一个坏主意。例如如果呼叫者致电
您正在公开所有可能未实现或有意义的功能。
对列表使用BlockingQueue。关闭它的线程。线程绕队列take()调用,当获得一个Email实例时,发送它并返回队列。
而不必每次都提到将元素添加到Email
“直接小号LinkedList
的几类,你应该实现的方法(如public void addEmail(...)
)在Email
类有东星其他类调用该方法,并传递新的电子邮件作为论据。
在这个addEmail
方法中,您可以将新电子邮件添加到LinkedList
(可能在检查它不在列表中)并启动您想要自动启动的线程。
将LinkedList<Email>
替换为LinkedBlockingDequeue<Email>
,立即启动您的线程,并将其传递给队列。该线程应该调用queue.take()
,这将阻塞,直到电子邮件变为可用。从本质上讲,你会得到一个等待队列接收端的休眠线程,产生你想要的效果:只要电子邮件插入到队列中,读线程就会醒来,抓住新的电子邮件,处理它,然后回去睡觉。
可否请您在此上下文中详细阐述'ExecutorService'或者提供一些示例。我之前从未使用过 – Abhi 2013-05-12 11:07:54
2004年,ExecutorService被添加到Java 5.0中,为队列和线程池提供封装。您可以将任务提交给您可以共同或单独控制的线程池。 http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html – 2013-05-12 11:10:07
谢谢你,向我介绍一个新功能。我通过'ExecutorService'而不是队列来实现它。它更简洁,更易于管理 – Abhi 2013-05-13 06:41:10