1. 程式人生 > >黑馬程式設計師——多執行緒之Runnable與Thread

黑馬程式設計師——多執行緒之Runnable與Thread

------Java培訓、Android培訓、java學習型部落格、期待與您交流! -------

一、程序和執行緒的基本概念和相互之間的關係。

       所謂程序,是一個具有獨立功能的程式關於某個資料集合的一次執行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不只是程式的程式碼,還包括當前的活動,通過程式計數器的值和處理暫存器的內容來表示。程序就好比是我們現實生活中的一個任務,這個任務需要佔據一定的時間和空間的開銷,任務於任務之間可以獨立進行,也可以相互之間協作合作完成。

       而執行緒則是程式執行流的最小單元,一個標準的執行緒由執行緒ID,當前指令指標(PC),暫存器集合和堆疊組成。另外,執行緒是程序中的一個實體,是被系統獨立排程和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點兒在執行中必不可少的資源,但它可與同屬一個程序的其它執行緒共享程序所擁有的全部資源。執行緒就相當於是一個任務中的子流程,比如說我們在完成一個專案的時候需要多個部門同時配合。而參與完成這個任務的技術部、財務部、人事部,等等就是這個任務(程序)中的執行緒(ps:這個比喻可能不是很恰當,理解即可)。

       程序和執行緒的區別:

       一個程式至少有一個程序,而一個程序最少要有一個執行緒。執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程是系統進行資源分配和排程的一個獨立單位.執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源.。一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行。

二、多執行緒的概念。

       多執行緒是指多個任務可以同時執行,比如我可以在聽歌的時候,順便看電影(ps:雖然說這樣很無聊,很吵)。多執行緒的出現不是為了提高執行效率,而是為了提高資源使用效率來提高系統的效率,多執行緒是為了同步完成任務,讓系統資源更加充分的得到利用。

三、Java實現多執行緒的兩種方法:繼承Thread類和實現Runnable介面。

       繼承Thread類:通過繼承Thread類,重寫Threadrun()方法,將執行緒執行的邏輯放在其中。

       通過實現Runnable介面,例項化Thread類。

       這兩種方式的區別:繼承Thread類這種方式沒有實現資源的共享。相當於是把不同的資源分給不同的程序,程序之間同步但獨立的執行。實現Runnable介面這種方式實現了資源共享,相當於把同一個資源分配給不同的程序,這些程序再執行的時候共享該資源。

       下面舉一個例項來說明這個問題:

        我們都知道鐵路局的買票系統是一個具有多執行緒功能的系統,那麼用這兩種方式來實現這個功能會有什麼區別呢?

       1、繼承Thread類:

             程式碼:

      

       執行結果:

      

       2、實現Runnable介面:

             程式碼:

       

        執行結果:

       

       由這個例子可以看出,其實繼承Thread是把不同的資源分給不同的程序使用,沒有實現資源共享。而實現Runnable介面則是把同一個資源給不同的程序使用,實現了資源共享。