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