902
技術社區[雲棲]
Java多線程(一)、理解進程與多線程的概念及關係
一、什麼是進程?
簡單理解,在多任務係統中,每個獨立運行的程序就是一個進程,也可以理解為當前正在運行的每個程序都是一個進程。我們現在使用的操作係統大都是多任務係統的,如:Windows、Linux、Mac OS X、Unix等。因為單個CPU在同一時刻隻能執行一個程序,這是鐵律。但在係統中單個CPU又怎麼能同時執行多個程序呢?實際情況這是由操作係統負責對CPU資源進行調度和分配管理的,雖然單個CPU在某一時刻隻能做一件事,但是它以非常小的時間間隔切換來執行多個程序,人用弱眼根本無法察覺CPU在來回交替執行多個程序,所以給人以在同一時刻同時執行多個程序的感覺。如果我們同時打開兩個記事本程序A和B,這就是兩個不同的進程,A編輯的文稿不會影響到B。因為每個進程都有獨立的代碼和數據存儲空間,操作的都是自己空間的數據,所以互不影響。
二、什麼是線程?
一個進程中可以包含一個或多個線程,一個線程就是程序內部的一條執行線索。在單線程中,當程序啟動時,就自動產生了一個線程,這個線程稱為主線程。主函數main就是在這個線程上運行的,然後主函數按照程序代碼的調用順序依次往下執行。在這種情況下,當主函數調用了子函數,主函數必須等待子函數返回以後才能繼續往下執行,不能實現兩段代碼交替執行的效果。如果要在一個程序中交替執行多段代碼,就需要產生多個線程,並指定每個線程上所要運行的程序代碼,這就是多線程。在Java中創建多線程有兩種方法:繼承java.lang.Thread類和實現Runnable接口,並調用Thread類的start方法來啟動線程。
三、進程與線程場景分析與理解
1> 計算機的核心是CPU,承擔了所有的計算任務。它就好比一座工廠,時刻都在運行。為工廠中的每個部件提供疏通與處理的服務。
2> 假設這座工廠的電力有限,一次隻能供給一個車間使用,也就是說一個車間開工的時候,其它車間都必須停工。背後的意思就是說一個CPU同一時間隻能執行一個任務(進程)。
3> 進程就好比工廠的車間,任一時刻都隻有一個車間在開工生產,其它車間都處於停工狀態。背後的意思就是說,CPU在任一時刻總是隻能運行單個進程,其它進程都處於非活動狀態。
4> 一個車間裏可以有很多個工人,它們協同完成一個任務。比如一個手機生產車間,張三負責主板的安裝與調試,李四負責顯示屏的測試與加工,王五負責手機零件的組裝等。線程就好比這車間裏的工人,一個進程包含了多個線程,它們各自負責完成自己的任務。
5> 車間裏的空間是工人們共享的,比如車間裏的許多房間(如:加工房、生產房、組裝房等),這些車間裏的每個房間,工人們都是可以隨意走動、進出的。這就象征者一個進程的內存空間是共享的,該進程中的所有線程都可以使用這片內存空間。
6> 可是車間裏每間房間的大小是不同的。有些房間最多隻能容納1個人,比如廁所,裏麵有人的時候,你就不能再進去了,需要等裏麵的人出來了你才能進去。也就是說當一個線程在使用某塊共享內存的時候,其它線程必須等待它使用結束之後,其它線程才能使用這塊內存。
7> 一個訪止他人進入的簡單辦法,就是進入廁所之後,在外麵掛一把鎖。先到的人進入廁所後鎖上門,後到的人看到廁所上鎖了,就在門口排隊,等鎖打開了再進去。這就是"互斥鎖"(mutex),防止多個線程同時讀寫某一塊內存區域中的數據。在Java中使用synchronized關鍵字實現多個線程之間的互斥。
8> 還有些房間,可以同時容納N個人,比如說廚房。如果人數大於N,多出來的人數隻能在外麵等著,等待其它人出來之後才能進去。這就好比某些共享內存區域,隻供固定數目的線程訪問。
這時的解決方式就是在門外掛N把鎖,進去的人就取一把鎖,出來時把鎖掛回原處。後到的人發現鑰匙架空了,就知道在門外排隊等著了。這種做法叫做“信號量(Semaphore)”,用來保證多個線程不會互相衝突。
最後更新:2017-04-03 18:51:58