摘要:一個(gè)進(jìn)程可以擁有多個(gè)線程,一個(gè)線程必須有一個(gè)父進(jìn)程。線程是獨(dú)立運(yùn)行的,它并不知道進(jìn)程中是否還有其他的線程存在。線程的調(diào)度和管理由進(jìn)程本身負(fù)責(zé)完成。因此多線程實(shí)現(xiàn)多任務(wù)并發(fā)比多線程的效率高。
??一個(gè)任務(wù)通常就是一個(gè)程序,每個(gè)運(yùn)行中的程序就是一個(gè)進(jìn)程。當(dāng)一個(gè)程序運(yùn)行時(shí),內(nèi)部可能包含了多個(gè)順序執(zhí)行流,每個(gè)順序執(zhí)行流就是一個(gè)線程。
進(jìn)程定義:
??當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即變成一個(gè)進(jìn)程。進(jìn)程是處于運(yùn)行過(guò)程中的程序,并且具有一定的獨(dú)立功能,進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。
進(jìn)程的特點(diǎn):獨(dú)立性:是系統(tǒng)獨(dú)立存在的實(shí)體,擁有自己獨(dú)立的資源,有自己私有的地址空間。在沒(méi)有經(jīng)過(guò)進(jìn)程本身允許的情況下,一個(gè)用戶的進(jìn)程不可以直接訪問(wèn)其他進(jìn)程的地址空間。
動(dòng)態(tài)性:進(jìn)程與程序的區(qū)別在于:程序只是一個(gè)靜態(tài)的指令集合,而進(jìn)程是一個(gè)正在系統(tǒng)中活動(dòng)的指令集和,進(jìn)程中加入了時(shí)間的概念。進(jìn)程具有自己的生命周期和不同的狀態(tài),這些都是程序不具備的。
并發(fā)性:多個(gè)進(jìn)程可以在單個(gè)處理器上并發(fā)執(zhí)行,多個(gè)進(jìn)程之間不會(huì)相互影響。
并行性和并發(fā)性??并行:指在同一時(shí)刻,有多條指令在多個(gè)處理上同時(shí)執(zhí)行。(多核同時(shí)工作)
??并發(fā):指在同一時(shí)刻只能有一條指令執(zhí)行,但多個(gè)進(jìn)程指令被快速輪換執(zhí)行,使得在宏觀上具有多個(gè)進(jìn)程同時(shí)執(zhí)行的效果。(單核在工作,單核不停輪詢)
線程??多線程擴(kuò)展了多進(jìn)程的概念,使得同一個(gè)進(jìn)程可以同時(shí)并發(fā)處理多個(gè)任務(wù)。
??線程(Thread)也被成為輕量級(jí)的進(jìn)程,線程是進(jìn)程執(zhí)行的單元,線程在程序中是獨(dú)立的、并發(fā)的執(zhí)行流
??當(dāng)進(jìn)程被初始化后,主線程就被創(chuàng)建了。絕大數(shù)應(yīng)用程序只需要有一個(gè)主線程,但也可以在進(jìn)程內(nèi)創(chuàng)建多條的線程,每個(gè)線程也是相互獨(dú)立的。
??一個(gè)進(jìn)程可以擁有多個(gè)線程,一個(gè)線程必須有一個(gè)父進(jìn)程。
??線程可以擁有自己的堆棧、自己的程序計(jì)數(shù)器和自己的局部變量,但不擁有系統(tǒng)資源,它與父進(jìn)程的其他線程共享該進(jìn)程所擁有的全部資源,因此編程更加方便。
??線程是獨(dú)立運(yùn)行的,它并不知道進(jìn)程中是否還有其他的線程存在。線程的執(zhí)行是搶占式的,即:當(dāng)前運(yùn)行的線程在任何時(shí)候都有可能被掛起,以便另外一個(gè)線程可以運(yùn)行。
??一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程,同一個(gè)進(jìn)程中多個(gè)線程之間可以并發(fā)執(zhí)行。
??線程的調(diào)度和管理由進(jìn)程本身負(fù)責(zé)完成。
??歸納而言:操作系統(tǒng)可以同時(shí)執(zhí)行多個(gè)任務(wù),每個(gè)任務(wù)就是進(jìn)程;進(jìn)程可以同時(shí)執(zhí)行多個(gè)任務(wù),每個(gè)任務(wù)就是線程
多線程的優(yōu)點(diǎn):
進(jìn)程之間不能共享內(nèi)存,但線程之間共享內(nèi)存非常容易
系統(tǒng)創(chuàng)建進(jìn)程要為該進(jìn)程重新分配系統(tǒng)資源,但創(chuàng)建線程的代價(jià)則小得多。因此多線程實(shí)現(xiàn)多任務(wù)并發(fā)比多線程的效率高。
Java語(yǔ)言內(nèi)置了多線程功能支撐,簡(jiǎn)化了多線程的編程。
線程的創(chuàng)建和啟動(dòng)一、繼承Thread類創(chuàng)建線程類
步驟:
① 定義Thread類的子類,并重寫該類的run()方法,該run()方法的方法體就代表了線程需要完成的任務(wù),稱為線程執(zhí)行體
② 創(chuàng)建Thread子類的實(shí)例,即創(chuàng)建了線程對(duì)象
③ 調(diào)用線程對(duì)象的start()方法來(lái)啟動(dòng)該線程
示例:
// 通過(guò)繼承Thread類來(lái)創(chuàng)建線程類 public class FirstThread extends Thread { private int i ; // 重寫run方法,run方法的方法體就是線程執(zhí)行體 public void run() { for ( ; i < 100 ; i++ ) { // 當(dāng)線程類繼承Thread類時(shí),直接使用this即可獲取當(dāng)前線程 // Thread對(duì)象的getName()返回當(dāng)前該線程的名字 // 因此可以直接調(diào)用getName()方法返回當(dāng)前線程的名 System.out.println(getName() + " " + i); } } public static void main(String[] args) { for (int i = 0; i < 100; i++) { // 調(diào)用Thread的currentThread方法獲取當(dāng)前線程 System.out.println(Thread.currentThread().getName() + " " + i); if (i == 20) { // 創(chuàng)建、并啟動(dòng)第一條線程 new FirstThread().start(); // 創(chuàng)建、并啟動(dòng)第二條線程 new FirstThread().start(); } } } }
① 當(dāng)Java程序開始運(yùn)行后,程序至少會(huì)創(chuàng)建一個(gè)主線程,main()方法的方法體代表主線程的線程執(zhí)行體
② 當(dāng)線程類繼承Tread類時(shí),直接使用this即可以獲取當(dāng)前線程
③ 繼承Thread類創(chuàng)建線程類,多個(gè)線程之間無(wú)法共享線程類的實(shí)例變量
二、實(shí)現(xiàn)Runnable接口創(chuàng)建線程類① 定義Runnable接口的實(shí)現(xiàn)類,并重寫該接口的run()方法
② 創(chuàng)建Runnable實(shí)現(xiàn)類的實(shí)例,并以此實(shí)例作為Thread的target來(lái)創(chuàng)建Tread對(duì)象,該Tread對(duì)象才是真正的線程對(duì)象
// 通過(guò)實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建線程類 public class SecondThread implements Runnable { private int i ; // run方法同樣是線程執(zhí)行體 public void run() { for ( ; i < 100 ; i++ ) { // 當(dāng)線程類實(shí)現(xiàn)Runnable接口時(shí), // 如果想獲取當(dāng)前線程,只能用Thread.currentThread()方法。 System.out.println(Thread.currentThread().getName() + " " + i); } } public static void main(String[] args) { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); if (i == 20) { SecondThread st = new SecondThread(); // ① // 通過(guò)new Thread(target , name)方法創(chuàng)建新線程 new Thread(st , "新線程1").start(); new Thread(st , "新線程2").start(); } } } }
① 實(shí)現(xiàn)Runnable接口創(chuàng)建線程類,必須通過(guò)Thread.currentThread()方法來(lái)獲得當(dāng)前線程對(duì)象
② 實(shí)現(xiàn)Runnable接口創(chuàng)建線程類,多個(gè)線程可以共享線程類的實(shí)例變量
三、使用Callable和Future創(chuàng)建線程Callable接口提供了一個(gè)call()方法,call()方法比run()方法更強(qiáng)大:
① call()方法可以由返回值
② call()方法可以聲明拋出異常
① 創(chuàng)建Callable接口的實(shí)現(xiàn)類,并實(shí)現(xiàn)call()方法,該call()方法作為線程執(zhí)行體,且該call()方法有返回值
② 使用FutureTask類來(lái)包裝Callable對(duì)象,該FutureTask對(duì)象封裝了該Callable對(duì)象的call()方法的返回值
③ 調(diào)用FutureTask對(duì)象的get()方法獲得子線程執(zhí)行結(jié)束的返回值
創(chuàng)建線程三種方式的對(duì)比:優(yōu)點(diǎn):
①實(shí)現(xiàn)的是接口,還可以繼承其他類
② 多個(gè)線程可以共享同一個(gè)target對(duì)象,適合多個(gè)相同的線程來(lái)處理同一份資源的情況
缺點(diǎn):
① 編程稍微復(fù)雜
② 獲取當(dāng)前線程必須用Thread.currentThread()方法來(lái)獲得
優(yōu)點(diǎn):
①編程簡(jiǎn)單
② 獲取當(dāng)前線程,可以直接使用this來(lái)獲得
缺點(diǎn):
① 已經(jīng)繼承了Thread類,不能繼承其他類
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/69113.html
摘要:本文主要內(nèi)容為簡(jiǎn)單總結(jié)中線程池的相關(guān)信息。方法簇方法簇用于創(chuàng)建固定線程數(shù)的線程池。三種常見(jiàn)線程池的對(duì)比上文總結(jié)了工具類創(chuàng)建常見(jiàn)線程池的方法,現(xiàn)對(duì)三種線程池區(qū)別進(jìn)行比較。 概述 線程可認(rèn)為是操作系統(tǒng)可調(diào)度的最小的程序執(zhí)行序列,一般作為進(jìn)程的組成部分,同一進(jìn)程中多個(gè)線程可共享該進(jìn)程的資源(如內(nèi)存等)。在單核處理器架構(gòu)下,操作系統(tǒng)一般使用分時(shí)的方式實(shí)現(xiàn)多線程;在多核處理器架構(gòu)下,多個(gè)線程能夠...
摘要:本篇博客主要針對(duì)虛擬機(jī)的晚期編譯優(yōu)化,內(nèi)存模型與線程,線程安全與鎖優(yōu)化進(jìn)行總結(jié),其余部分總結(jié)請(qǐng)點(diǎn)擊虛擬總結(jié)上篇,虛擬機(jī)總結(jié)中篇。 本篇博客主要針對(duì)Java虛擬機(jī)的晚期編譯優(yōu)化,Java內(nèi)存模型與線程,線程安全與鎖優(yōu)化進(jìn)行總結(jié),其余部分總結(jié)請(qǐng)點(diǎn)擊Java虛擬總結(jié)上篇 ,Java虛擬機(jī)總結(jié)中篇。 一.晚期運(yùn)行期優(yōu)化 即時(shí)編譯器JIT 即時(shí)編譯器JIT的作用就是熱點(diǎn)代碼轉(zhuǎn)換為平臺(tái)相關(guān)的機(jī)器碼...
閱讀 2753·2021-10-11 10:57
閱讀 1586·2021-09-26 09:55
閱讀 1322·2021-09-06 15:11
閱讀 3465·2021-08-26 14:16
閱讀 680·2019-08-30 15:54
閱讀 548·2019-08-30 12:43
閱讀 3307·2019-08-29 16:18
閱讀 2586·2019-08-23 16:14