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