Udemy Course Multithreading, Concurrency & Performance 30

Java原生Object當作Condition Variable — wait(),notify(),notifyAll() 實際範例

ZONGRU Li
Sep 27, 2021

首先執行講師提供的10*10矩陣產生器--MatricesGenerator

MatricesGenerator的細節不在課程範圍,可以之後研究Code內容

單純執行產生10*10矩陣數個

執行數秒後refresh多出:

很多個10*10的矩陣

...

上述近上萬個10*10矩陣接下來將設計

Producer將倆倆的10*10矩陣對塞進一個Queue儲存器(用LinkedList來放)

Consumer將Queue儲存器內的矩陣對拿出來,並做兩個矩陣相乘,得新的矩陣

最後Consimer將結果矩陣另外寫檔

  1. 首先建立矩陣對物件:

2. 接著建立Queue來放矩陣對,主要放入LinkedList這個Thread Not Safe物件

並且宣告isEmpty與isTerminate屬性

3.接著針對Producer要使用的add方法簡單寫為如下(不難理解在做的事)

放矩陣對,宣告現在Queue內不空了,通知1個Consumer Thread

4.Consumer執行的從Queue內移除矩陣對

5.Producer執行後最終會消耗完所以有矩陣檔案內的所有矩陣

6.建立Producer的Thread物件

裡面放讀檔用的Scanner與存放矩陣對的Queue當建構子

7.建立Consumer的Thread物件

裡面放寫檔用的FileWriter與存放矩陣對的Queue當建構子

矩陣對相乘
矩陣對相乘後結果寫檔

8.寫Main,實際建立各個Thread物件並啟動

此時完整程式如下

From https://www.udemy.com/course/java-multithreading-concurrency-performance-optimization/

執行看到

一直增加(i.e.Producer做事比Consumer快,畢竟Consumer比較複雜)
Queue內的矩陣對持續增加
近6萬是高點
下跌(i.e. Producer吃完原檔內的矩陣了)

...

大略做圖的話可得到如下

但是Queue(LinkedList)是使用記憶體在儲存著矩陣對,也就是可能存在上限

所以有可能會有以下狀況

為了避免上述狀況,我們應該增加相對應的限制!!!!!!!

就這樣改造而已!!!!

接著執行看到:

Queue儲放的矩陣對永遠的卡在上限5的數量

...

慢慢地還是跑完

這樣改造後,即可以保證不會因為記憶體不足而crash!!!

完整Code如下

From https://www.udemy.com/course/java-multithreading-concurrency-performance-optimization/

結果檔在:

有正常產檔(上面觀念比較重要)

如何避免造成OutOfMemoryException,良好的程式碼設計才是重要的部分!

參考課程

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet