Java 两个线程同时运行的睡眠时间有多长

Java 两个线程同时运行的睡眠时间有多长,java,multithreading,performance,Java,Multithreading,Performance,我正在编写代码来读取一个大型JSON文件并在数据库中写入数据。我正在旋转两个线程,一个从文件中读取(蒸汽和对象的混合模式,使用Gson逐个读取),将对象放入阻塞队列,第二个线程从队列中读取数据,并使用1000的批大小保存到db中。 我没有在线程1中放置任何睡眠计时器,另一方面,线程2正在保存数据之前使用睡眠(200) 我想知道在线程1中设置10-20毫秒的睡眠是否也有帮助? 使用睡眠是否有助于线程间的性能切换?如果不运行基准测试,很难说什么性能,但是。。。原则上,您根本不需要sleep()(如果

我正在编写代码来读取一个大型JSON文件并在数据库中写入数据。我正在旋转两个线程,一个从文件中读取(蒸汽和对象的混合模式,使用Gson逐个读取),将对象放入阻塞队列,第二个线程从队列中读取数据,并使用1000的批大小保存到db中。 我没有在线程1中放置任何睡眠计时器,另一方面,线程2正在保存数据之前使用睡眠(200)

我想知道在线程1中设置10-20毫秒的睡眠是否也有帮助?
使用睡眠是否有助于线程间的性能切换?

如果不运行基准测试,很难说什么性能,但是。。。原则上,您根本不需要
sleep()
(如果队列已满,生产者将阻止,如果队列为空,消费者将阻止)


您可以使用
yield()
来提示当前线程已达到切换到另一个线程的最佳状态。

您是否只有一个内核?或者其他核心忙吗?否则,你就不需要睡觉了

即使只有一个内核,您也不需要
睡眠
。让解析器
将整个批处理放入队列中,让DB编写器
获取它们。我希望队列大小为2,这样数据库就不可能不必要地空闲


由于JDBC连接是同步的,DB编写器可能会花费大部分时间等待事务提交。

我不是Java开发人员,但原则是一样的

  • 不要使用睡眠
  • 使用生产者-消费者模式
  • 在生产者-消费者模式中,第一个线程(生产者)尽可能快地从JSON中读取数据,并将其放入线程安全队列,第二个线程(消费者)从该队列中读取数据

    简化算法

    生产者线程

  • 从JSON文件读取数据
  • 将读取数据写入队列
  • 设置同步事件以通知使用者线程
  • 转到1
  • 消费者线程

  • 等待,直到设置了同步事件
  • 从队列中读取数据
  • 将数据保存到数据库
  • 如果队列非空,则转到2,否则转到1

  • 生产者-消费者是一种众所周知的模式,因此在Java中不难找到相同的示例。例如,看。

    无。您不应该依靠睡眠来确保多线程正确交互。相反,他们应该使用同步、锁、缓冲区(队列,尤其是有限长度队列)来确保正确的操作

    yield()
    应谨慎使用。Javadoc说
    调度程序可以随意忽略此提示。
    不,它不是:“提示”意味着“建议”:-)为什么要使用
    sleep()
    ?其目的是什么?共有4个内核,此代码作为批处理作业的一部分运行。同时还会有其他批处理作业在运行。我只想给每个线程足够的时间来处理数据,以便并行地读写数据。队列大小实际上并不重要,因为ASA reader(no sleep()调用)将对象放入队列,writer使用它并保存到内存中以满足批处理大小。关于jdbc连接,您确实提出了一个观点。我通过从writer中删除sleep()来运行一次,看看在性能方面是否有任何差异。@vermap我真的愿意让解析器进行批处理,因为这意味着通过队列的通信更少(尽管队列非常有效)<如果希望其他无关线程运行得更多,代码>睡眠
    可能会很有用,但如果不是这样,就没有意义了。