[英]How to run three threads simultaneously with different sleep time in a while loop?
[英]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開發人員,但是原理是相同的。
在生產者-消費者模式中,第一個線程(生產者)盡可能快地從JSON讀取數據,並將其放入線程安全隊列中,第二個線程(消費者)從中讀取數據。
簡化算法。
生產者線程。
使用者線程。
生產者-消費者是眾所周知的模式,因此在Java中找到相同的示例並不難。 例如看這里 。
沒有。 您不應該依賴睡眠來確保多個線程正確交互。 他們應該改用同步,鎖,緩沖區(隊列,特別是有限長度的隊列)以確保正確的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.