多執行緒程式設計
為了滿足業務需求,無論PC(個人計算機)還是智慧手機(Smart Phone)現在都支援多工,都能夠編寫併發訪問程式。多執行緒程式設計可以編寫併發訪問程式。
在多執行緒OS(作業系統)中,通常是在一個程序中包括多個執行緒,每個執行緒都是作為利用CPU的基本單位,是花費最小開銷的實體。一般可以在同一時間內執行多個程式的作業系統都有程序的概念。
開啟Windows當前執行的程序,如圖所示:

程序
一個程序就是一個執行中的程式,而每一個程序都有自己獨立的一塊記憶體空間、一組系統資源。在程序的概念中,每一個程序的內部資料和狀態都是完全獨立的。
在Windows作業系統中一個程序就是一個exe或者dll程式,它們相互獨立,互相也可以通訊,在智慧手機作業系統中程序間的通訊應用也是很多的。
執行緒
執行緒與程序相似,是一段完成某個特定功能的程式碼,是程式中單個順序控制的流程,但與程序不同的是,同類的多個執行緒是共享一塊記憶體空間和一組系統資源。所以系統在各個執行緒之間切換時,開銷要比程序小的多,正因如此,執行緒被稱為輕量級程序。一個程序中可以包含多個執行緒。
主執行緒
Java程式至少會有一個執行緒,這就是主執行緒,程式啟動後是由JVM(Java虛擬機器)建立主執行緒,程式結束時由JVM停止主執行緒。 主執行緒和子執行緒的關係 是主執行緒它負責管理子執行緒,即子執行緒的啟動、掛起、停止等等操作 。
程序、主執行緒和子執行緒關係如圖所示:

獲取主執行緒示例程式碼如下:
publicclass MyThread{
publicstatic void main(String[] args) {
//獲取主執行緒
Thread thread= Thread.currentThread();
System.out.println("主執行緒名:" + thread.getName());
}
}
執行緒的狀態
線上程的生命週期中,執行緒會有幾種狀態,如圖所示,執行緒有5種狀態。下面分別介紹:

1. 新建狀態
新建狀態(New)是通過new等方式建立執行緒物件,它僅僅是一個空的執行緒物件。
2. 就緒狀態
當主執行緒呼叫新建執行緒的start()方法後,它就進入就緒狀態(Runnable),此時的執行緒尚未真正 開 始執行run()方法,它必須等待CPU的排程。
3. 執行狀態
CPU的排程就緒狀態的執行緒,執行緒進入執行狀態(Running),處於執行狀態的執行緒獨佔CPU, 執行run()方法。
4. 阻塞狀態
因為某種原因執行狀態的執行緒會進入不可執行狀態,即阻塞狀(Blocked),處於阻塞狀態的線 程JVM系統不能執行該執行緒,即使CPU空閒。如下幾個原因會導致執行緒進入阻塞狀態:
1)當前執行緒呼叫sleep()方法,進入休眠狀態。
2)被其他執行緒呼叫了join()方法,等待其他執行緒結束。
3)發出I/O請求,等待I/O操作完成期間。
4)當前執行緒呼叫wait()方法。
5. 死亡狀態
執行緒退出run()方法後,就會進入死亡狀態(Dead),執行緒進入死亡狀態有可以是正常實現完成 run()方法進入,也可能是由於發生異常而進入的。
執行緒間通訊
如果兩個執行緒之間有依賴關係,執行緒之間必須進行通訊,互相協調才能完成(任務)工作。
例如,一個執行緒生成了一些資料,將資料壓棧;另一個執行緒需要這些資料,將資料出棧。這兩個執行緒互相依賴,當堆疊為空時,消費執行緒無法取出資料時,應該通知生成執行緒新增資料;當堆疊已滿時,生產執行緒無法新增資料時,應該通知消費執行緒取出資料。
完成執行緒間的通訊,在Java中有幾個方法:
(1)void wait():使當前執行緒釋放物件鎖,然後當前執行緒處於物件等待佇列中阻塞狀態。,等待 其他執行緒喚醒。
(2)void wait(long timeout):同wait()方法,等待timeout毫秒時間後進入佇列中阻塞狀 態。
(3)void notify():當前執行緒喚醒此物件等待佇列中的一個執行緒,執行緒將進入就緒狀態。
(4)void notifyAll():當前執行緒喚醒此物件等待佇列中的所有執行緒,執行緒將進入就緒狀 態。
