java并發(fā)讀取文件 java多線(xiàn)程讀取txt文件?
java多線(xiàn)程讀取txt文件?調(diào)用上面的函數(shù),而不是直接在原程序中讀取,函數(shù)將統(tǒng)一讀取行。這樣,無(wú)論您有n個(gè)線(xiàn)程還是一個(gè)線(xiàn)程,都不會(huì)重復(fù)讀取行或不完整的讀取行。為了充分利用多線(xiàn)程,必須將文件劃分為多個(gè)
java多線(xiàn)程讀取txt文件?
調(diào)用上面的函數(shù),而不是直接在原程序中讀取,函數(shù)將統(tǒng)一讀取行。這樣,無(wú)論您有n個(gè)線(xiàn)程還是一個(gè)線(xiàn)程,都不會(huì)重復(fù)讀取行或不完整的讀取行。
為了充分利用多線(xiàn)程,必須將文件劃分為多個(gè)區(qū)域,以便每個(gè)線(xiàn)程讀取。然后我們需要一個(gè)算法來(lái)計(jì)算每個(gè)線(xiàn)程的開(kāi)始和結(jié)束位置。首先,根據(jù)配置的線(xiàn)程數(shù)和文件的總長(zhǎng)度,計(jì)算每個(gè)線(xiàn)程的平均分配讀取長(zhǎng)度。
但是,由于該文件是純文本文件,因此必須按行處理。如果分割點(diǎn)在一條直線(xiàn)的中間,那么直線(xiàn)數(shù)據(jù)將被分成兩部分,并由兩個(gè)線(xiàn)程同時(shí)處理。這種情況不可能發(fā)生。所以每個(gè)區(qū)域末尾的字符必須是換行符。第一個(gè)區(qū)域的開(kāi)始位置為0,結(jié)束位置設(shè)置為(文件長(zhǎng)度/線(xiàn)程數(shù))。如果結(jié)束位置不是換行符,則只能增加1,直到它成為換行符。
多個(gè)線(xiàn)程可以讀一個(gè)變量,只有一個(gè)線(xiàn)程可以對(duì)這個(gè)變量進(jìn)行寫(xiě),到底要不要加鎖?
下面簡(jiǎn)要說(shuō)明以下原因:
鎖定是因?yàn)椴僮鞑皇窃拥?。讓我們用操作一?lái)解釋它??聪旅鎯蓚€(gè)圖。
我這個(gè)操作需要
看上面的第二個(gè)圖,你能很清楚地理解這個(gè)過(guò)程嗎?
鎖定是為了確保上述三個(gè)步驟是原子操作。
回到問(wèn)題上來(lái),只有一個(gè)線(xiàn)程要寫(xiě),沒(méi)有競(jìng)爭(zhēng),所以不需要鎖定。
但是,如果你看第一張圖片,因?yàn)橹鲀?nèi)存和本地內(nèi)存的存在
在一個(gè)線(xiàn)程寫(xiě)入后,其他線(xiàn)程無(wú)法立即看到它。這就是可見(jiàn)性問(wèn)題。
添加volatile關(guān)鍵字后,它將在操作后強(qiáng)制工作內(nèi)存和主內(nèi)存同步,以確保其他線(xiàn)程可以立即看到它。