Java线程正确的实现方式

时间:2018-04-21 18:41:48

标签: java

这个项目的要点是每秒为数据库添加一个时间戳。

我需要什么。

1。 BackgroundTask,用于将生成的时间戳添加到db。

2。 BackgroundTask,用于在服务器连接脱机时向Buffer添加数据。

3. 在数据库中添加保存到缓冲区的数据,同时在应用运行时保存新的timestamps

我已经完成了第一和第二部分,但很难搞清楚第三部分。

我有2个线程类,都实现了Runnable

当服务器状态为正时,Thread A 会将数据添加到数据库。

当服务器状态为负时Thread B 会创建Buffer并将数据存储在那里。

现在我需要Thread C ,它每5秒尝试连接一次服务器,当它建立连接时Thread B 应该以某种方式将数据实现到数据库(以FIFO顺序)。

我无法弄清楚如何处理线程以及实现更多功能的正确方法,有人可以告诉我如何实现以下功能吗?

2 个答案:

答案 0 :(得分:2)

如何使用BlockingQueue,特别是LinkedBlockingQueue(FIFO)?

线程A将继续在队列中添加数据,无论连接是否可用,线程B将尝试读取并提交到DB,因此在队列中没有数据的情况下,线程B将阻塞并等待数据。

注意:如果要确保没有任何任务被拒绝,请选择无限制的阻止队列。

答案 1 :(得分:1)

我会使用两个线程来实现它,线程 A 会每秒写入LinkedList,并且所有线程 A 都是关心;并且线程 B 从头部(LinkedList.remove())连续读取并尝试将其上传到数据库,这样如果失败,您可以无限期地重试,直到它成功,然后继续读取头部LinkedList。

但是,您必须牢记线程安全。话虽这么说,我认为你应该没问题,如果你只是设置线程 B 在线程 A 之后运行半秒,因为线程 B 永远不会领先线程 A ,即使每次上传到数据库都成功。