我正在编写代码以读取大型JSON文件并将数据写入数据库。我正在旋转2个线程,一个从文件中读取(蒸汽和对象的混合模式,使用Gson一对一读取),将对象放入阻塞队列中,第二个线程从队列中读取数据,并使用1000的批处理大小保存到db中。 我没有在线程1中放置任何睡眠计时器,另一方面,线程2在保存数据之前正在使用睡眠(200)。
我想知道在线程1中睡眠10到20毫秒是否也会有所帮助? 使用睡眠是否有助于明智地在线程之间进行性能切换?
答案 0 :(得分:1)
在不运行基准的情况下很难说出任何性能,但是...原则上,您根本不需要sleep()
(如果队列已满,生产者将阻塞,如果队列为空,则消耗者将阻塞)。
您可以使用yield()
来暗示当前线程已达到一个点,在这种情况下最好切换到另一个线程。
答案 1 :(得分:0)
您只有一个核心吗?还是其他核心忙?否则,只要睡一觉,就不需要它。
即使只有一个内核,也不需要sleep
。让解析器put
整批进入队列,让数据库编写器take
将它们放入队列。我会选择两个队列,以免数据库不必要地空闲。
由于JDBC连接是同步的,因此DB编写器可能花费大量时间等待事务提交。
答案 2 :(得分:0)
我不是Java开发人员,但是原理相同。
在生产者-消费者模式中,第一个线程(生产者)尽可能快地从JSON读取数据,并将其放入线程安全队列中,第二个线程(消费者)从中读取它们。
简化算法。
生产者线程。
消费线程。
生产者-消费者是一种众所周知的模式,因此在Java中找到相同的示例并不难。例如看here。
答案 3 :(得分:0)
没有。您不应该依赖睡眠来确保多个线程正确交互。他们应该改用同步,锁,缓冲区(队列,特别是有限长度的队列)以确保正确的操作。