簡體   English   中英

2個線程同時運行的睡眠時間好多少

[英]How much sleep time is good for 2 threads running simultaneously

我正在編寫代碼以讀取大型JSON文件並將數據寫入數據庫。 我正在旋轉2個線程,一個從文件中讀取(蒸汽和對象的混合模式,使用Gson一對一讀取),將對象放入阻塞隊列,第二個線程從隊列中讀取數據,並使用1000的批處理大小保存到db中。另一方面,線程2不會在線程1中放置任何睡眠計時器,而在保存數據之前,線程2正在使用睡眠(200)。

我想知道在線程1中睡眠10-20毫秒是否也會有所幫助? 使用睡眠是否有助於明智地在線程之間進行性能切換?

在不運行基准的情況下很難說出任何性能,但是...原則上,您根本不需要sleep() (如果隊列已滿,生產者將阻塞,如果隊列為空,則生產者將阻塞)。

您可以使用yield()來暗示當前線程到達了一個好點,切換到另一個線程可能是一個好主意。

您只有一個核心嗎? 還是其他核心忙? 否則,只要睡一覺,就不需要它。

即使只有一個核心,也不需要sleep 讓您的解析器put 整個批處理放入隊列中,讓您的DB編寫器take它們。 我將使用兩個隊列,這樣數據庫就不可能不必要地空閑。

由於JDBC連接是同步的,因此DB編寫器可能會花費大部分時間來等待事務提交。

我不是Java開發人員,但是原理是相同的。

  1. 不要睡覺。
  2. 使用生產者-消費者模式。

在生產者-消費者模式中,第一個線程(生產者)盡可能快地從JSON讀取數據,並將其放入線程安全隊列中,第二個線程(消費者)從中讀取數據。

簡化算法。

生產者線程。

  1. 從JSON文件讀取數據。
  2. 將讀取的數據寫入隊列。
  3. 設置同步事件以通知使用者線程。
  4. 轉到1。

使用者線程。

  1. 等待直到設置了同步事件。
  2. 從隊列中讀取數據。
  3. 將數據保存到數據庫。
  4. 如果隊列非空,請轉到2,否則請轉到1。

生產者-消費者是眾所周知的模式,因此在Java中找到相同的示例並不難。 例如看這里

沒有。 您不應該依賴睡眠來確保多個線程正確交互。 他們應該改用同步,鎖,緩沖區(隊列,特別是有限長度的隊列)以確保正確的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM