多線程編程:多線程並發制單的開發記錄
進程和線程:
下圖是在來自知乎用戶的解釋,感覺很到位
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。
線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。線程是程序中一個單一的順序控制流程。進程內一個相對獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單位指運行中的程序的調度單位。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。
進程和線程的關係:
線程安全:
何為線程安全?就是應用中多個線程訪問某一個類(對象或方法)時,這個類始終能表現出正確的行為,那麼這個類(對象或方法)就是線程安全的。
線程安全就是多線程訪問時,採用了加鎖機制(在多線程安全上加鎖也是一門技術活,不是說對於共享資源你簡單加個同步關鍵字或定義成同步方法就OK了的,鎖的不合理則會大大影響程序的性能,甚至影響到業務,這裡本人親身經歷過一個問題,鎖粒度大小對程序的影響,參考:http://www.cnblogs.com/1315925303zxz/p/7561236.html),當一個線程訪問該類的某個數據時,進行保護,其他線程不能進行訪問直到該線程讀取完,其他線程才可使用。不會出現數據不一致或者數據污染。
線程不安全呢,就是不提供數據訪問保護,有可能出現多個線程先後更改數據造成所得到的數據是臟數據。這裡的加鎖機制常見的如:synchronized。
由spring管理的線程池進行並發制單的業務設計:
業務需求:多個通道進行數據採集,數據採集就是拿著VIN碼去抓取數據,但是當VIN碼很多時,採集的速度就很慢,所以實施多線程多並發進行採集。
1、spring管理線程池的配置,這裡需要說明的一點就是核心線程數和最大線程數的配置一定要按照自己業務的並發量來設定,否則不僅不會提升並發效率,反而會出現各種數據污染的情況。
2、線程制單業務(這裡是偽代碼),將符合條件的VIN碼進行數據採集,否則記錄到指定容器中統一處理(退單)。
初始化任務(VIN碼)隊列:
制單:
再次強調:加鎖的時候一定要掌握好鎖的粒度,不然會影響並發效率。
3、模擬多通道進行數據採集。
後期繼續更新多線程並發的文章(轉自博客園)
· 學IT,就來中公優就業:http://www.ujiuye.com/
· 2017年【中公教育】特別推出2017年就業促進計劃,500萬就業基金助你成為IT達人
詳情請戳http://www.ujiuye.com/zt/jycj/?wt.bd=bgz
· 什麼?海量IT學習資料白給你都不要?別想了,加群搶:584539956
※收藏|Prometheus 入門
※關鍵CSS和Webpack:減少阻塞渲染的CSS的自動化解決方案
※想學技能卻不敢去培訓機構?別怕!政府給你保駕護航!
※給你一個2018年初20萬年薪入職的機會,就現在!
※編譯期類型檢查 in ClojureScript
TAG:IT優就業 |