詳情描述
千鋒老師又來發(fā)福利啦,這次是多線程編程。
一、進(jìn)程與線程
進(jìn)程(Process)是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。線程,有時(shí)被稱為輕量級(jí)進(jìn)程(Lightweight Process,LWP),是程序執(zhí)行流的至小單元。線程是程序中一個(gè)單一的順序控制流程。在單個(gè)程序中同時(shí)運(yùn)行多個(gè)線程完成不同的工作,稱為多線程。
二、同步與異步
對(duì)于一次方法的調(diào)用來說,同步方法調(diào)用一旦開始,就必須等待該方法的調(diào)用返回,后續(xù)的方法才可以繼續(xù)執(zhí)行;異步的話,方法調(diào)用一旦開始,就可以立即返回,調(diào)用者可以執(zhí)行后續(xù)的方法,這里的異步方法通常會(huì)在另一個(gè)線程里真實(shí)的執(zhí)行,而不會(huì)妨礙當(dāng)前線程的執(zhí)行。
三、并行與并發(fā)
并發(fā)和并行是兩個(gè)相對(duì)容易比較混淆的概念。他都可以表示在同一時(shí)間范圍內(nèi)有兩個(gè)或多個(gè)任務(wù)同時(shí)在執(zhí)行,但其在任務(wù)調(diào)度的時(shí)候還是有區(qū)別的,首先看下圖:
并發(fā)任務(wù)執(zhí)行過程:
從上圖中可以看到,兩個(gè)任務(wù)在執(zhí)行的時(shí)候,并發(fā)是沒有時(shí)間上的重疊的,兩個(gè)任務(wù)是交替執(zhí)行的,由于切換的非???,對(duì)于外界調(diào)用者來說相當(dāng)于同一時(shí)刻多個(gè)任務(wù)一起執(zhí)行了;而并行可以看到時(shí)間上是由重疊的,也就是說并行才是真正意義上的同一時(shí)刻可以有多個(gè)任務(wù)同時(shí)執(zhí)行。
四、Java實(shí)現(xiàn)多線程方式
(1)繼承Thread,重寫run()方法
輸出結(jié)果:
另外,要明白啟動(dòng)線程的是 start()方法而不是run()方法,如果用run()方法,那么他就是一個(gè)普通的方法執(zhí)行了。
(2)實(shí)現(xiàn) 接口
這里Thread和Runnable的關(guān)系是這樣的:
Thread類本身實(shí)現(xiàn)了Runnable接口,并且持有run方法,但Thread類的run方法主體是空的,Thread類的run方法通常是由子類的run方法重寫。
(3)實(shí)現(xiàn) Callable 接口處理帶有返回值的線程
從Java 1.5開始,就提供了Callable和Future,依靠它們可以在任務(wù)執(zhí)行完畢之后得到任務(wù)執(zhí)行結(jié)果。
五、JDK自帶線程池
可以看到我們?cè)谏线叺腃allable例子中使用了JDK線程池。Java由提供四種線程池,分別為:
創(chuàng)建一個(gè)可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
創(chuàng)建一個(gè)定長線程池,可控制線程至大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待。
當(dāng)然,多線程編程只是Java編程入門知識(shí)的一部分,全部內(nèi)容請(qǐng)來千鋒教育。
千鋒教育:
千鋒西安校區(qū):
西安校區(qū)地址:西安市雁塔區(qū)高新六路52號(hào)立人科技C座西區(qū)4樓
人 :任老師
面授課程:全棧WEB+培訓(xùn)、全鏈路設(shè)計(jì)培訓(xùn)、PHP全棧+服務(wù)器集群培訓(xùn)、JavaEE+分布式開發(fā)培訓(xùn)、大數(shù)據(jù)+人工智能培訓(xùn)、 Unity游戲開發(fā)培訓(xùn)、Python培訓(xùn)、云計(jì)算+Python運(yùn)維培訓(xùn)、全棧軟件測(cè)試培訓(xùn)、Android培訓(xùn)、iOS培訓(xùn)