充分利用cpu資源
高併發:系統接受實現多使用者多請求的高併發時,通過多執行緒來實現。
大任務:大任務處理起來比較耗時,這時候可以起到多個執行緒並行加快處理(例如:分片上傳)。比如處理乙個for迴圈時要花費大量時間,就可以考慮多執行緒了
先說一下此功能用到的知識點:
執行緒池執行緒
countdownlatch
計數
countdownlatch donesignal = new countdownlatch(1000);
//2.建立執行緒池來存放執行緒,以防考生數量太多建立太多執行緒,占用過多資源
threadpoolexecutor executor = new threadpoolexecutor(50, 150, 60000, timeunit.milliseconds, new linkedblockingdeque<>());
for (examinationmodel examineemodel : notexamstudentinfo) finally
}});
//3. 將任務新增到執行緒池
executor.execute(thread);
}// 4. 為了讓所有的試卷都生成之後再執行壓縮以及刪除pdf檔案,所以需要讓主線程等待子執行緒執行完之後再執行await
try catch (interruptedexception e)
//5. 關閉執行緒池(所有執行緒執行完關閉執行緒池)
executor.shutdown();
// 6. 將所有試卷打包zip
boolean flag = filetozip();
實現思路:
建立執行緒池,和執行緒鎖計數器,每列印乙份試卷就是乙個任務,將次任務新增到執行緒池中,然後執行緒執行,當所有的試卷都列印完,將所有的試卷打包成zip
知識點講解:
之所以用執行緒池,是因為防止產生過多的執行緒,從而造成執行緒來回切換,而造成的形成損失
countdownlatch:它的作用是允許1或n個執行緒等待其他執行緒完成執行,在這用它是因為 要把所有的試卷,打包成zip壓縮包,所以主線程要等所有的子執行緒即生成試卷要執行完才能打包,用到了countdownlatch的await()和countdown()方法,有關countdownlatch更多講解,參見:
我這建立的核心執行緒為50,最大執行緒為150,更具電腦cpu效能設定,執行程式列印執行緒號,執行緒號一直超不過50,是因為任務佇列使用的是linkedblockingdeque,大小為integer.max_value(integer.max_value=7fffffff(十六進製制) = 2147483647(十進位制)),任務佇列一直沒有滿,具體原因詳情參見:
使用join()可能出現的問題:
join()後面的**可能提前完成,這樣打包的資料就不全了
join()過程中可能被打斷了,這樣系統就會拋異常(因為底層呼叫的是wait()),如果不想讓程式判斷就得做各種異常的判斷,比較麻煩
多執行緒爬蟲實戰
from urllib import request,error import re headers user agent mozilla 5.0 windows nt 10.0 win64 x64 rv 68.0 gecko 20100101 firefox 68.0 opener request...
多執行緒 多執行緒原理
我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.簡單地說就是程序...
Java多執行緒之《守護執行緒》實戰
定義 什麼是守護執行緒?與守護執行緒相對應的就是使用者執行緒,守護執行緒就是守護使用者執行緒,當使用者執行緒全部執行完結束之後,守護執行緒才會跟著結束。也就是守護執行緒必須伴隨著使用者執行緒,如果乙個應用內只存在乙個守護執行緒,沒有使用者執行緒,守護執行緒自然會退出。應用 下面是守護執行緒的乙個簡單...