黑马程序员—————— 多线程
java使用Thread類代表線程,所有的線程對(duì)象都必須是Thread類或其子類的實(shí)例。每個(gè)線程的作用是完成一定的任務(wù),實(shí)際上就是執(zhí)行一段程序流(一段順序執(zhí)行的代碼)。java使用線程執(zhí)行體來代表這段程序流。
?
繼承Thread類創(chuàng)建線程類
通過繼承Thread類來創(chuàng)建并啟動(dòng)多線程的步驟如下:
1:定義Thread類的子類,并重寫該類的run()方法,該方法的方法體就代表了線程需要完成的任務(wù)。因此把run()方法稱為線程執(zhí)行體。
2:創(chuàng)建Thread子類的實(shí)例。即創(chuàng)建了線程的對(duì)象。
3:調(diào)用線程對(duì)象的start()方法來啟動(dòng)線程。
?
實(shí)現(xiàn)Runnable接口創(chuàng)建線程類
實(shí)現(xiàn)Runnable接口來創(chuàng)建并啟動(dòng)多線程的步驟如下。
1:定義Runnable接口的實(shí)現(xiàn)類,并重寫該接口的run()方法,該run()方法的方法體同樣是該線程的線程執(zhí)行體。
2:創(chuàng)建Runnable實(shí)現(xiàn)類的實(shí)例,并以此實(shí)例作為Thread的target來創(chuàng)建Thread對(duì)象,該Thread對(duì)象才是真正的線程對(duì)象
3:調(diào)用線程對(duì)象的start()方法來啟動(dòng)該線程
?
java5提供了Callable接口,該接口則呢呣看都像是Runable接口的增強(qiáng)版,Callable接口提供了一個(gè)call()方法可以作為線程執(zhí)行體,但call()方法比run()方法功能更加強(qiáng)大。
1:call()方法可以有返回值
2:call()方法可以聲明拋出異常
因此完全可以提供一個(gè)Callable對(duì)象作為Thread的target,而該線程的線程執(zhí)行體就是該Callable對(duì)象的call()方法。問題是,Callable接口是java5新增的接口,而且它不是Runnable接口的子接口。所以Collable對(duì)象不能直接作為Thread的target.而且call()方法還有一個(gè)返回值,call方法并不是直接調(diào)用,他是作為線程執(zhí)行體被調(diào)用的那么如何獲取call()的返回值呢?
jiava5提供了Future接口來代表Callable接口里call()方法的返回值,并為Future接口提供了一個(gè)實(shí)現(xiàn)類FutureTask。該實(shí)現(xiàn)類實(shí)現(xiàn)了Future接口,并實(shí)現(xiàn)了Runnable接口。可以作為Thread類的target.
Callable接口有泛型的限制,Callable接口里的泛型形參類型與call()方法的返回值類型相同。而且Callable接口是函數(shù)式接口,因此可使用Lanbda表達(dá)式創(chuàng)建Callable對(duì)象。
創(chuàng)建并啟動(dòng)有返回值的線程步驟如下:
1:創(chuàng)建Callable接口的實(shí)現(xiàn)類,并實(shí)現(xiàn)call()方法,該方法將作為線程執(zhí)行體,且該方法有返回值,再創(chuàng)建Callable實(shí)現(xiàn)類的實(shí)例。
2:使用FutureTask類包裝Callable對(duì)象,該FutureTask對(duì)象封裝了該Callable對(duì)象的call()方法的返回值
3:使用FutureTask對(duì)象作為Thread對(duì)象的target創(chuàng)建并啟動(dòng)新線程
4:調(diào)用FutureTask對(duì)象的get()方法來獲得子線程執(zhí)行結(jié)束后的返回值。
?
?
?
1:多線程
(1)多線程:一個(gè)應(yīng)用程序有多條執(zhí)行路徑
進(jìn)程:正在執(zhí)行的應(yīng)用程序
線程:進(jìn)程的執(zhí)行單元,執(zhí)行路徑
單線程:一個(gè)應(yīng)用程序只有一條執(zhí)行路徑
多線程:一個(gè)應(yīng)用程序有多條執(zhí)行路徑
多進(jìn)程的意義?
提高CPU的使用率
多線程的意義?
提高應(yīng)用程序的使用率
(2)Java程序的運(yùn)行原理及JVM的啟動(dòng)是多線程的嗎?
A:Java命令去啟動(dòng)JVM,JVM會(huì)啟動(dòng)一個(gè)進(jìn)程,該進(jìn)程會(huì)啟動(dòng)一個(gè)主線程。
B:JVM的啟動(dòng)是多線程的,因?yàn)樗畹陀袃蓚€(gè)線程啟動(dòng)了,主線程和垃圾回收線程。
(3)多線程的實(shí)現(xiàn)方案(自己補(bǔ)齊步驟及代碼 掌握)
A:繼承Thread類
B:實(shí)現(xiàn)Runnable接口
(4)線程的調(diào)度和優(yōu)先級(jí)問題
A:線程的調(diào)度
a:分時(shí)調(diào)度
b:搶占式調(diào)度 (Java采用的是該調(diào)度方式)
B:獲取和設(shè)置線程優(yōu)先級(jí)
a:默認(rèn)是5
b:范圍是1-10
(5)線程的控制(常見方法)
A:休眠線程
B:加入線程
C:禮讓線程
D:后臺(tái)線程
E:終止線程
(6)線程的生命周期
A:新建
B:就緒
C:運(yùn)行
D:阻塞
E:死亡
多線程安全問題的原因(也是我們以后判斷一個(gè)程序是否有線程安全問題的依據(jù))
A:是否有多線程環(huán)境
B:是否有共享數(shù)據(jù)
C:是否有多條語(yǔ)句操作共享數(shù)據(jù)
同步解決線程安全問題
A:同步代碼塊
synchronized(對(duì)象) {
需要被同步的代碼;
}
這里的鎖對(duì)象可以是任意對(duì)象。
B:同步方法
把同步加在方法上。
這里的鎖對(duì)象是this
C:靜態(tài)同步方法
把同步加在方法上。
轉(zhuǎn)載于:https://www.cnblogs.com/-9527/p/5230699.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的黑马程序员—————— 多线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最简单的Dubbo教程(springBo
- 下一篇: WebStorm 2018破解版