我正在實現一個任務,其中包含一個類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