線程與進程的區別:
一個進程可以由很多個線程組成。線程是進程裏面的一個執行路徑。例如“人在跑”是一個進程,而“大腿肌肉收縮”是其中的一個線程。
進程是靜態的概念,它本身並不能跑,一個exe,一個class,都可以說是進程,平常說的進程的執行,主要是講其中的main函數(主線程)跑起來了。在機器上運行的實際上都是線程。
現在主流的系統都是支持多進程的,例如你打開了QQ的同時還能打開網頁。但是DOS系統是隻支持單進程的,在同一個時間點只能有一個進程在執行。
(嚴格來說,任何CPU在一個時間點上都只有一個進程在運行,只是因爲windows等系統的cpu計算速度快,在不同的進程之間來回切換,就造成了同一時間運行多進程的假象,真正意義上的多線程,只有當機器上有多個CPU才能實現)
java.lang.Thread類:
每個Thread對象代表了一個線程。
創建線程的方法有兩種:
①:實現Runnable接口
Thread t = new Thread(target); // target爲Runnable接口類型
Runnable中只有一個方法:public void run(); // 用來定義線程的運行體
②:繼承Thread類(Thread類本身也實現了Runnable接口)
重寫Thread類的run方法
一般採用第一種方法,因爲JAVA可以多實現,但是隻能單繼承
VM啓動的時候會有一個主方法(public static void main)所定義的線程,我們可以通過在main方法裏面創建Thread的實例來創建新線程。並通過Thread的start()方法來啓動線程。(其實就是調用了其中的run方法,run方法結束,線程就結束)
線程的運行圖示:
線程控制的一些基本方法:
synchronized :
Java語言的關鍵字,當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多隻有一個線程執行該段代碼。
一、當兩個併發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內只能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼塊以後才能執行該代碼塊。
二、然而,當一個線程訪問object的一個synchronized(this)同步代碼塊時,另一個線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。
三、尤其關鍵的是,當一個線程訪問object的一個synchronized(this)同步代碼塊時,其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。
四、第三個例子同樣適用其它同步代碼塊。也就是說,當一個線程訪問object的一個synchronized(this)同步代碼塊時,它就獲得了這個object的對象鎖。結果,其它線程對該object對象所有同步代碼部分的訪問都被暫時阻塞。
五、以上規則對其它對象鎖同樣適用.