2013-05-12 33 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(),這將阻塞,直到電子郵件變爲可用。從本質上講,你會得到一個等待隊列接收端的休眠線程,產生你想要的效果:只要電子郵件插入到隊列中,讀線程就會醒來,抓住新的電子郵件,處理它,然後回去睡覺。