改了一下實現,采用“生產者-消費者”模式。每個串口一個線程,讀取BlockingQueue里的待發信息,作為消費者,發送完畢后把發送結果寫到另外一個BlockingQueue里;查詢線程定時查詢數據庫,獲得待發信息并加入到BlockingQueue里;結果更新線程讀取BlockingQueue里的短信發送結果,更新到數據庫里,并把結果發送到客戶端。
這樣會帶來一個問題,發送線程發送短信需要一定的時間,可能某條待發信息已經在隊列里了,但查詢線程并不知道,繼續把該信息入列,所以發送線程在發送某條短信前要檢查數據庫,看是否已經發送過,如果發送過,則不再發送。