改了一下实现,采用“生产者-消费者”模式。每个串口一个线程,读取BlockingQueue里的待发信息,作为消费者,发送完毕后把发送结果写到另外一个BlockingQueue里;查询线程定时查询数据库,获得待发信息并加入到BlockingQueue里;结果更新线程读取BlockingQueue里的短信发送结果,更新到数据库里,并把结果发送到客户端。
这样会带来一个问题,发送线程发送短信需要一定的时间,可能某条待发信息已经在队列里了,但查询线程并不知道,继续把该信息入列,所以发送线程在发送某条短信前要检查数据库,看是否已经发送过,如果发送过,则不再发送。