1. 程式人生 > >多執行緒在實際專案中的簡單應用

多執行緒在實際專案中的簡單應用

專案中如何使用多執行緒
      多執行緒在專案中主要用來解決併發任務執行。java中執行緒的主要實現方式有三種:繼承Thread類 實現Runnable介面 實現Callable介面。另外還可以通過Executor類來建立多執行緒執行緒池。
       執行緒生命週期:首先通過繼承thread或者實現runnable介面來建立一個執行緒,當呼叫執行緒的start方法,執行緒進入就緒狀態,如果這時處理器有資源執行此執行緒,執行緒就進入執行狀態,如果執行緒內部呼叫了sleep就會放棄cpu資源,返回到阻塞狀態,執行緒等待某個通知,sleep時間到了之後,如果其他執行緒傳送通知,那麼當前執行緒就從阻塞狀態變為就緒狀態恢復執行。另如果呼叫了yield()方法也會從執行狀態變為就緒狀態。一般來說執行緒執行完畢或者呼叫stop方法執行緒結束生命週期。
       四種模板執行緒池:1可快取執行緒池 newCachedThreadPool 2定長執行緒池 newFixedThreadPool 3定長支援定時及週期性任執行緒池, newScheduledThreadPool 4單執行緒化的執行緒池(有序) newSingleThreadExecutor 。我們在專案中主要使用了第二種就是定長執行緒池newFixedThreadPool,一般多執行緒進行並行任務處理需要配合佇列使用。佇列中存放任務資訊,當執行緒池中的執行緒進行任務處理,主動去佇列領取任務,佇列將任務彈出並交由執行緒執行,所有執行緒誰先執行完,就領取行的任務,直到佇列中沒有任務。
        執行緒安全:一般通過加鎖解決安全問題,保證資料一致性。一般我們可以使用synchronized標記方法或者程式碼塊,來保證原子性操作。但是synchronized效能不如volatile。 在java底層中一些設計執行緒安全的原始碼都是用了volatile關鍵字。多執行緒如果要保證資料安全必須要保證原子性、可見性以及有序性。一般情況下當多個執行緒同時執行時,如果多個執行緒同時訪問同一變數,如果變數所在方法沒有使用synchronized,將導致每個執行緒只關注自己執行緒內cache的變數值,當多個執行緒將變數同步到主執行緒的主存時,會發生資料不一致的情況。如果使用volatile可以讓變數擁有可見性,多個執行緒進行執行時,每個執行緒都會看到主執行緒中的主存的變數值發生的改變,進行修正,保證與自己執行緒資料同步,線上程修改變數時,volatile關鍵字會強制將修改的值立即寫入主存,其他執行緒中的對應快取變數就會被強制標記為無效,而從主存中進行同步。

專案業務場景:
    批量頁面靜態化 在系統中,商品詳情頁我們使用freemarker來進行頁面靜態化,每天夜裡12點開始要對所有商品頁面進行一遍靜態化,由於商品數量比較多 如果使用單執行緒將耗時過長,我們使用一個定長執行緒池進行批量執行,將任務放在佇列中,多個執行緒同時領取並執行。
 
訂單處理(使用者下單後可能支付狀態不明確,我們後臺可以通過多執行緒去主動核實第三方支付狀態,來更新我們系統的訂單狀態)
登入後用戶資訊處理(使用者登入後應該通知各相關係統將使用者常用資料進行快取 以快速響應登入使用者),