JavaSE入门学习50:多线程编程(一)
一進程和線程
? ? ? ??(1)進程和線程的基本概念
? ? ? ? 進程:程序(任務)的執行過程;持有資源(共享內存,共享文件)和線程。
? ? ? ? 線程:是一個程序內部的順序控制流。
? ? ? ? 我們生活中的進程例子很多,一個進程就相當于一個你在電腦上啟動的程序。比如我們打開最常用的聊天工具
QQ,也可以打開Java的開發工具Eclipse等等。這些都算Window操作系統上的一個進程。
? ? ? ? 對于Window操作系統上一個線程,還是拿QQ進程和Eclipse進程來舉例,QQ進程中的文字聊天和收發文件就是
其中的兩個線程;Eclipse進程中的源代碼文件編輯、源代碼編譯和語法校驗就是其中的三個線程。
? ? ? ? 通過上面的知識可以得出:?? ? ? ? ? ? ? ? ? ??
? ? ? ? 1)一個進程可以有多個線程;
? ? ? ? 2)線程是系統中最小的執行單元;
? ? ? ? 3)同一進程中有多個線程;
? ? ? ? 4)線程共享進程的資源。
? ? ? ??(2)線程和進程的區別
? ? ? ? 每個進程都有獨立的代碼和數據空間(進行上下文),進程間的切換會有較大的開銷。多進程指的是在操作系統中
同時運行多個任務(程序)。
? ? ? ?線程可以看成輕量級的進程,同一類線程共享代碼和數據空間,每個線程有獨立的運行棧和程序計數器(PC),線
程切換的開銷小。多線程指的是在同一程序中有多個順序流相同時執行。
? ? ? ?(3)線程交互
? ? ? ?線程間的通信包括互斥和同步。
? ? ? ?互斥:通常表現在多個線程競爭同一資源,比如這里只有一只筆,同時有幾個人要進行簽到,但資源(筆)唯一,
線程(人)之間就存在競爭關系,并且同一時間只有一個線程(人)能夠持有這個資(筆)。
? ? ? ?同步:同步就是協同步調,按預定的先后次序進行運行,如進程、線程同步,可理解為進程或線程A和B一塊配
合,A執行到一定程度時要依靠B的某個結果,于是停下來,示意B運行;B依言執行,再將結果給A;A再繼續操作。
? ? ? ?二Java多線程
? ? ? ?Java多線程是通過java.lang.Thread類來實現的。VM啟動時會有一個由主方法(public static void main(){})所定義
的線程。可以通過創建Thread類的實例來創建新的線程。每個線程都是通過某個特定Thread類的對象所對應的方法
run()來完成其操作的,方法run()稱為線程體。通過調用Thread類的start()方法來啟動一個線程。
? ? ? ?(1)Thread類
? ? ? ?API中定義的Thread類:
? ? ? ?線程是程序中的執行線程。Java虛擬機允許應用程序并發地運行多個執行線程。 每個線程都有一個優先級,高優
先級線程的執行優先于低優先級線程。每個線程都可以或不可以標記為一個守護程序。當某個線程中運行的代碼創建
一個新 Thread 對象時,該新線程的初始優先級被設定為創建線程的優先級,并且當且僅當創建線程是守護線程時,
新線程才是守護程序。?
? ? ? ?當Java虛擬機啟動時,通常都會有單個非守護線程(它通常會調用某個指定類的 main()方法。Java虛擬機會繼續
執行線程,直到下列任一情況出現時為止:?
? ? ? ? 1)調用了Runtime類的exit()方法,并且安全管理器允許退出操作發生。?
? ? ? ? 2)非守護線程的所有線程都已停止運行,無論是通過從對run()方法的調用中返回,還是通過拋出一個傳播到run()
方法之外的異常。?
? ? ? ?創建新執行線程有兩種方法。一種方法是將類聲明為Thread類的子類。該子類應重寫Thread類的run()方法。接
下來可以分配并啟動該子類的實例。例如,計算大于某一規定值的質數的線程可以寫成:
[java]?view plaincopy print?
? ? ? ??然后,下列代碼會創建并啟動一個線程:?
[java]?view plaincopy print?
? ? ? ? 創建線程的另一種方法是聲明實Runnable接口的類。該類然后實現run()方法。然后可以分配該類的實例,在創
建Thread類時作為一個參數來傳遞并啟動。采用這種風格的同一個例子如下所示:?
[java]?view plaincopy print?
? ? ? ? 然后,下列代碼會創建并啟動一個線程:?
[java]?view plaincopy print?
? ? ? ?每個線程都有一個標識名,多個線程可以同名。如果線程創建時沒有指定標識名,就會為其生成一個新名稱。?
? ? ? ?Thread類中定義關于線程優先級的字段:
? ? ? ?Thread類中定義的構造方法:
? ? ? ?Thread類中定義的方法:
? ? ? ?(2)Runnable接口
? ? ? ?API中描述的Runnable接口:
? ? ? ?Runnable接口應該由那些打算通過某一線程執行其實例的類來實現。類必須定義一個稱為run()的無參數方法。
?設計Runnable接口的目的是為希望在活動時執行代碼的對象提供一個公共協議。例如,Thread類實現了Runnable接
口。激活的意思是說某個線程已啟動并且尚未停止。?
? ? ? ?此外,Runnable接口為非Thread子類的類提供了一種激活方式。通過實例化某個 Thread類實例并將自身作為運
行目標,就可以運行實現Runnable接口的類而無需創建Thread類的子類。大多數情況下,如果只想重寫run()方法,
而不重寫其他Thread類方法,那么應使用Runnable接口。這很重要,因為除非程序員打算修改或增強類的基本行
為,否則不應為該類創建子類。
? ? ? ?Runnable接口中只定義了一個方法:
?
? ? ? ?(3)線程的創建與啟動
? ? ? ?Java中可以有兩種方式創建新的線程。
? ? ? ?第一種:定義線程類實現Runnable接口
? ? ? ?Thread myThread=new Thread(target) ?//target為Runnable接口類型。
? ? ? ?Runnable接口中只有一個方法:
? ? ? ?public void run();//定義線程運行體。
? ? ? ?使用Runnable接口可以為多個線程提供共享的數據。
? ? ? ?在實現Runnable接口的類的run()方法中可以使用Thread的靜態方法:
? ? ? ?public static Thread correntThread() ?獲取當前線程的引用
? ? ? ?第二種:定義線程類繼承Thread類
? ? ? ?定義一個Thread類的子類并重寫其run()方法如:
? ? ? ?class MyThread extends Thread{
? ? ? ? ? ? ? public void run(){...}
? ? ? ? }
? ? ? ? 然后生成該類的對象:
? ? ? ? MyThread myThread = new Mythread(...)
? ? ? ? 實例:
? ? ? ? TestThread1.java源代碼:
? ? ? ? 方法調用的順序執行,也就是先執行Runnable1線程,再執行主線程。
[java]?view plaincopy print?
? ? ? ? 線程啟動后的交替執行,其中最重要的是Thread類的start()方法,即Runnable1線程和主線程交替執行。
[java]?view plaincopy print?
? ? ? ? 運行結果:
? ? ? ? 使用繼承Thread類的修改后的代碼:
[java]?view plaincopy print?
? ? ? ? 運行結果:
? ? ? ?推薦使用實現Runnable接口的線程類來進行多線程的創建與啟動,比較靈活。
? ? ? ?關于兩種方法創建線程的不同
? ? ? ?第一:創建線程只有繼承Thread類和實現Runnable接口兩種方式(Thread也是實現了Runnable接口);
? ? ? ?第二:若以繼承Thread類方式創建線程則這個類的實例就可以重寫Thread類的幾十個方法,注意是好幾十個方
法;
? ? ? ?第三:若以實現Runnable接口的方式創建線程則僅僅只有一個run()方法可供重寫(注意是只有一個);
? ? ? ?實現Runnable接口創建的線程最終還是要通過將自身實例作為參數傳遞給Thread類然后執行,當你要為一個沒
有繼承Thread類的類創建線程,而且只想讓這個類的實例調用run()方法執行任務,這時候Runnable接口就相當于為
你的目標類提供了一個激活方式,設計該接口的目的是為了那些希望在激活時執行代碼的對象提供一個公共協議,激
活的意思是說某個線程已啟動并且尚未停止。?
? ? ? ?這兩種創建線程的方法本身沒有什么不同,一個是實現Runnable接口,一個是繼承Thread類。而使用實現
Runnable接口這種方法:1.可以避免Java的單繼承的特性帶來的局限性;2.適合多個相同程序的代碼去處理同一個資
源的情況,把線程同程序的代碼及數據有效分離,較好地體現了面向對象的設計思想。開發中大多情況下都使用實現
Runnable接口這種方法創建線程。
from:?http://blog.csdn.net/erlian1992/article/details/51706914
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的JavaSE入门学习50:多线程编程(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java核心技术点之动态代理
- 下一篇: JavaSE入门学习51:多线程编程(二