說到線程,通常要說到進程。微信
進程是指每一個獨立程序在計算機上的一次執行活動,例如運行中的微信程序等。多線程
進程進一步能夠細化爲線程,線程是一個程序內部的一條執行路徑。若是一個程序中能夠在同一時間內執行多個線程,就說這個程序是支持多線程的。併發
從定義來講,線程只是一個程序內部的一條執行路徑,而進程是全部線程的集合。ide
從切換開銷來講,線程間的切換開銷小,而進程間的切換開銷大。spa
Java中的線程分爲兩類:一種是用戶線程,另外一種是守護線程。任何線程均可以是「用戶線程」或「守護線程」,它們幾乎在每一個方面都是同樣的,惟一的區別是判斷虛擬機什麼時候離開。線程
用戶線程:Java虛擬機在它全部非守護線程都已經離開後自動離開。orm
守護線程:是用來服務用戶線程的,若是沒有其餘用戶線程在運行,那麼就沒有可服務的對象,也就沒有理由繼續下去。也被稱爲「後臺線程」或「精靈線程」。對象
Java垃圾回收線程就是一個典型的守護線程,當程序中再也不有任何運行中的線程時,程序就不會再產生垃圾,垃圾回收器也就無事可作,因此當垃圾回收線程是Java虛擬機上僅剩的線程時,Java虛擬機會自動離開,結束程序的運行。繼承
使用setDaemon(true)方法設置。接口
併發和並行是兩個概念。
並行指同一時刻有多條指令在多個處理器上同時執行。
併發指同一時刻只能有一條指令執行,但多個進程指令被快速輪換執行,使得在宏觀上具備多個進程同時執行的效果。
程序須要同時執行兩個或多個任務時;
程序須要實現一些須要等待的任務時,例如用戶輸入等;
須要一些後臺運行的程序時。
提升應用程序響應,加強用戶體驗。
提升計算機CPU的利用率,節省響應時間。
改善程序結構。
多線程有3大特性,分別爲原子性、可見性、有序性。
原子性是指一個操做是不可中斷的。
可見性是指當一個線程修改了某一個共享變量的值,其餘線程是否可以當即知道這個修改。
有序性是指在併發時,程序的執行可能會出現亂序。給人的直觀感受就是:寫在前面的代碼,會在後面執行。
推薦閱讀:建立線程主要有3種方式:
經過繼承Thread類來建立
經過實現Runnable接口來建立
經過實現Callable接口來建立
定義Thread類的子類,並重寫該類的run()方法,該run()方法的方法體就表明了線程須要完成的任務。
建立Thread子類的實例,即建立了線程對象。
調用線程對象的start()方法來啓動該線程。
定義Runnable接口的實現類,並重寫該接口的run()方法,該run()方法的方法體是該線程的線程執行體。
建立Runnable實現類的實例,並以此實例做爲Thread的target來建立Thread對象,該Thread對象纔是真正的線程對象。
調用線程對象的start()方法來啓動該線程。
建立Callable接口的實現類,並實現call()方法,該call()方法將做爲線程執行體,且該call()方法有返回值,再建立Callable實現類的實例。
使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法 的返回值。
使用FutureTask對象做爲Thread對象的target建立並啓動新線程。
調用FutureTask類對象的get()方法來得到子線程執行結束後的返回值。
通常推薦採用實現Runnable接口、Callcable接口的方式來建立多線程,由於相較於繼承Thread類的方法,實現Runnable接口、Callcable接口的方式有以下優勢:
線程類只是實現了Runnable接口或者Callcable接口,還能夠繼承其餘類。
在這種方式下,多個線程能夠共享同一個target對象,因此很是適合多個相同線程來處理同一份資源的狀況,從而能夠將CPU、代碼和數據分開,造成清晰的模型,較好地體現了面向對象的思想。
啓動線程使用start()方法,而不是run()方法;
調用start()方法來啓動線程,系統會把該run()方法當成線程執行體來處理;
若是直接調用線程對象的run()方法,則run()方法當即就會被執行,並且在run()方法返回以前其餘線程沒法並行執行。