多線程

『來(lái)源:HollisChuang


1巧鸭、進(jìn)程和線程的區(qū)別

??進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng)旅薄,進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。每一個(gè)進(jìn)程都有一個(gè)自己的地址空間。進(jìn)程具有一定的獨(dú)立功能供炼。

??線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位一屋。線程在程序中是獨(dú)立的并發(fā)的執(zhí)行流。

??線程自己不擁有系統(tǒng)資源袋哼,它與父進(jìn)程的其他線程共享該進(jìn)程所擁有的全部資源冀墨,線程只擁有一點(diǎn)在運(yùn)行中必不可少的資源,比如:自己的堆棧涛贯、自己的程序計(jì)數(shù)器和自己的局部變量诽嘉。

??一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程;同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。線程的執(zhí)行時(shí)搶占式的弟翘,也就意味著當(dāng)前運(yùn)行的線程在任何時(shí)候都有可能被掛起虫腋,以便另外一個(gè)線程可以運(yùn)行。
?
區(qū)別:

??① 一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程

??② 內(nèi)存共享:進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元(一個(gè)進(jìn)程崩潰后稀余,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響)悦冀;

??而多個(gè)線程共享進(jìn)程提供的內(nèi)存(擁有自己的私有棧空間只是作為運(yùn)行需要的極少內(nèi)存)睛琳,從而極大地提高了程序的運(yùn)行效率雏门,但一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉。所以多進(jìn)程的程序要比多線程的程序健壯

??③ 因?yàn)榫€程的劃分尺度小于進(jìn)程掸掏,使得多線程程序的并發(fā)行高茁影。

??④ 執(zhí)行過(guò)程:進(jìn)程獨(dú)立執(zhí)行;線程不能夠獨(dú)立執(zhí)行丧凤,必須依存在應(yīng)用程序中募闲,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。

??⑤ 從邏輯角度來(lái)看愿待,多線程的意義在于一個(gè)應(yīng)用程序中浩螺,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。

??但操作系統(tǒng)并沒(méi)有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用仍侥,來(lái)實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配要出。這就是進(jìn)程和線程的重要區(qū)別。

參考鏈接
https://blog.csdn.net/mxsgoden/article/details/8821936

??

2农渊、并行和并發(fā)的區(qū)別和聯(lián)系

??并行:是指在同一時(shí)刻患蹂,有多條指令在多個(gè)處理器上同時(shí)執(zhí)行。

??并發(fā):是指在同一時(shí)刻只能有一條指令執(zhí)行砸紊,但多個(gè)進(jìn)程指令被快速輪換執(zhí)行传于,使得在宏觀上具有多個(gè)進(jìn)程同時(shí)執(zhí)行的效果。

??

3醉顽、同步和異步

??同步:可以理解為在執(zhí)行完一個(gè)函數(shù)或方法之后沼溜,一直等待系統(tǒng)返回值或消息,這時(shí)程序是出于阻塞的游添,只有接收到返回的值或消息后才往下執(zhí)行其他的命令系草。

??異步:執(zhí)行完函數(shù)或方法后通熄,不必阻塞性地等待返回值或消息,只需要向系統(tǒng)委托一個(gè)異步過(guò)程找都,那么當(dāng)系統(tǒng)接收到返回值或消息時(shí)唇辨,系統(tǒng)會(huì)自動(dòng)觸發(fā)委托的異步過(guò)程,通過(guò)狀態(tài)檐嚣、通知和回調(diào)來(lái)通知調(diào)用者,從而完成一個(gè)完整的流程啰扛。

??同步在一定程度上可以看做是單線程嚎京,這個(gè)線程請(qǐng)求一個(gè)方法后就待這個(gè)方法給他回復(fù),否則他不往下執(zhí)行(死心眼)隐解。

??異步在一定程度上可以看做是多線程的鞍帝,請(qǐng)求一個(gè)方法后,就不管了煞茫,繼續(xù)執(zhí)行其他的方法帕涌,等有返回值以后,再回來(lái)執(zhí)行程序
??

4续徽、多線程的實(shí)現(xiàn)方式蚓曼,有什么區(qū)別

實(shí)現(xiàn)方式:
① 繼承Thread

??繼承Thread類,重寫(xiě)run()方法钦扭,實(shí)例化線程類纫版,調(diào)用start()方法啟動(dòng)線程。
??
??
② 實(shí)現(xiàn)Runnable接口

??實(shí)現(xiàn)Runnable接口并重寫(xiě)run()方法客情,創(chuàng)建Runnable實(shí)例其弊,并以此實(shí)例作為Thread類的target參數(shù)創(chuàng)建Thread對(duì)象,調(diào)用Thread對(duì)象的start()啟動(dòng)線程
??

③ 使用Callable接口和Future來(lái)創(chuàng)建線程
??
??實(shí)現(xiàn)Callable接口膀斋,并實(shí)現(xiàn)call()方法梭伐,并創(chuàng)建Callable實(shí)例,然后使用FutureTask對(duì)象來(lái)包裝Callable實(shí)例仰担,使用FutureTask對(duì)象作為Threadtarget來(lái)創(chuàng)建并啟動(dòng)線程
??
區(qū)別:
??Runnable接口和Callable接口的方式基本相同(實(shí)現(xiàn)Runnable接口和Callable接口僅僅是創(chuàng)建了一個(gè)任務(wù)糊识,但是仍然需要Thread類來(lái)創(chuàng)建線程并啟動(dòng)),他倆唯一區(qū)別只是Callable接口實(shí)現(xiàn)方法有返回值,并且也可以聲明拋出異常而已摔蓝,可以歸為一類技掏。
??
1、繼承Thread實(shí)現(xiàn)線程

??① 已經(jīng)繼承了Thread類项鬼,不能繼承其他類

??② 獲取當(dāng)前線程哑梳,可以直接使用this來(lái)獲得
??
2、實(shí)現(xiàn)Runnable接口绘盟、Callable接口創(chuàng)建線程

??①實(shí)現(xiàn)的是接口鸠真,還可以繼承其他類

??② 多個(gè)線程可以共享同一個(gè)target對(duì)象悯仙,適合多個(gè)相同的線程來(lái)處理同一份資源的情況

??③ 獲取當(dāng)前線程必須用Thread.currentThread()方法來(lái)獲得

http://www.liuzk.com/183.html
??

5、什么叫守護(hù)線程

??在Java中有兩類線程:User Thread(用戶線程)吠卷、Daemon Thread(守護(hù)線程) 锡垄。

??守護(hù)線程, 是指在程序運(yùn)行的時(shí)候在后臺(tái)提供一種通用服務(wù)的線程, 比如垃圾回收線程就是一個(gè)很稱職的守護(hù)者。

??并且這種線程并不屬于程序中不可或缺的部分祭隔。因此只要當(dāng)前JVM實(shí)例中尚存在任何一個(gè)非守護(hù)線程沒(méi)有結(jié)束货岭,守護(hù)線程就全部工作;只有當(dāng)最后一個(gè)非守護(hù)線程結(jié)束時(shí)疾渴,守護(hù)線程隨著JVM一同結(jié)束工作千贯。

??可以通過(guò)調(diào)用線程的setDaemon()方法,傳入?yún)?shù)true搞坝,將一個(gè)用戶線程設(shè)置為一個(gè)守護(hù)線程
??
這里有幾點(diǎn)需要注意:
??(1) thread.setDaemon()必須在thread.start()之前設(shè)置搔谴,否則會(huì)跑出一個(gè)IllegalThreadStateException異常。你不能把正在運(yùn)行的常規(guī)線程設(shè)置為守護(hù)線程桩撮。

??(2) 在Daemon線程中產(chǎn)生的新線程也是Daemon的敦第。

??(3) 不要認(rèn)為所有的應(yīng)用都可以分配給Daemon來(lái)進(jìn)行服務(wù),比如讀寫(xiě)操作或者計(jì)算邏輯店量。 因?yàn)槟悴豢赡苤涝谒械腢ser完成之前芜果,Daemon是否已經(jīng)完成了預(yù)期的服務(wù)任務(wù)。一旦User退出了融师,可能大量數(shù)據(jù)還沒(méi)有來(lái)得及讀入或?qū)懗鍪δ唬?jì)算任務(wù)也可能多次運(yùn)行結(jié)果不一樣。這對(duì)程序是毀滅性的诬滩。
??

6霹粥、如何停止一個(gè)線程?

??① 設(shè)置一個(gè)標(biāo)志位 需要用volatile來(lái)修飾疼鸟,保證線程讀取時(shí)標(biāo)志位是最新數(shù)據(jù)

??② 在sleep狀態(tài)下使用interrupt()方法后控,程序拋出InterruptedException,捕捉這個(gè)異常來(lái)結(jié)束程序空镜。但仍要調(diào)用Thread.currentThread().interrupt()恢復(fù)中斷浩淘,讓線程退出。
??

7吴攒、什么是線程安全张抄?

??線程安全就是多線程訪問(wèn)同一代碼,不會(huì)產(chǎn)生不確定的結(jié)果洼怔。

如何保證線程安全
對(duì)非安全的代碼進(jìn)行加鎖控制署惯;
使用線程安全的類;
多線程并發(fā)情況下镣隶,線程共享的變量改為方法級(jí)的局部變量极谊。

https://blog.csdn.net/suifeng3051/article/details/52164267
??

8诡右、synchronized 和 lock的區(qū)別

主要相同點(diǎn):

??Lock能完成synchronized所實(shí)現(xiàn)的所有功能

主要不同點(diǎn):

??Lock有比synchronized更精確的線程語(yǔ)義和更好的性能。

??Lock的鎖定是通過(guò)代碼實(shí)現(xiàn)的轻猖,而synchronized是在JVM層面上實(shí)現(xiàn)的帆吻,synchronized會(huì)自動(dòng)釋放鎖,而Lock一定要求程序員手工釋放咙边,并且必須在finally從句中釋放猜煮。

??Lock還有更強(qiáng)大的功能,例如败许,它的tryLock方法可以非阻塞方式去拿鎖王带。

??Lock鎖的范圍有局限性,塊范圍檐束,而synchronized可以鎖住塊辫秧、對(duì)象束倍、類被丧。
??

9、當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后绪妹,其它線程是否可進(jìn)入此對(duì)象的其它方法?

現(xiàn)在分兩種情況來(lái)討論:

??1.當(dāng)前線程調(diào)用的是synchronized普通方法(相對(duì)于static方法)甥桂;
??2.當(dāng)前線程調(diào)用的是synchronized static方法。

1.當(dāng)前線程調(diào)用的是synchronized普通方法(相對(duì)于static方法)時(shí)邮旷,其它線程是否可進(jìn)入此對(duì)象的其它方法:

1)其它方法是加了synchronized的普通方法黄选,不能;

2)其它方法是沒(méi)加synchronized的普通方法婶肩,能办陷;

3)其它方法是synchronized的static方法,能律歼;

4)其它方法是沒(méi)加synchronized的static方法民镜,能。

5)如果這個(gè)方法內(nèi)部調(diào)用了wait险毁,則可以進(jìn)入其他synchronized方法制圈。
(因?yàn)楫?dāng)前線程執(zhí)行同步代碼塊或同步方法時(shí),程序執(zhí)行了同步監(jiān)視器對(duì)象的wait()方法畔况,則當(dāng)前線程暫停鲸鹦,并釋放同步器)

2.當(dāng)前線程調(diào)用的是synchronized static方法,其它線程是否可進(jìn)入此對(duì)象的其它方法:

1)其它方法是加了synchronized的普通方法跷跪,能馋嗜;

2)其它方法是沒(méi)加synchronized的普通方法,能吵瞻;

3)其它方法是synchronized的static方法嵌戈,不能覆积;

4)其它方法中有synchronized(xxx.class)的,不能熟呛;

5)其它方法是沒(méi)加synchronized的static方法宽档,能。

所謂的synchronized(xxx.class)就是同步代碼塊:

public void method5(){
        synchronized(xxx.class){
                System.out.println("this is a  synchronized static method——method5.");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    }

參考鏈接:java線程之——synchronized的注意細(xì)節(jié)

??

10庵朝、啟動(dòng)一個(gè)線程是用run()還是start()?

??啟動(dòng)一個(gè)線程是使用star()吗冤,啟動(dòng)線程后,系統(tǒng)會(huì)把該線程的run()方法當(dāng)成線程執(zhí)行體來(lái)處理九府。

??如果使用的是run()方法椎瘟,則run()方法會(huì)被立即執(zhí)行,而且在run()方法返回之前其他線程無(wú)法并發(fā)執(zhí)行侄旬。

??因此如果直接調(diào)用線程對(duì)象的run()方法肺蔚,系統(tǒng)會(huì)把線程對(duì)象當(dāng)成一個(gè)普通對(duì)象,而run()方法也是一個(gè)普通方法儡羔,而不是線程體宣羊。
??

11、wait和sleep的區(qū)別

??sleep()方法是Thread類中方法汰蜘,而wait()方法是Object類中的方法仇冯。

??sleep()方法導(dǎo)致了程序暫停執(zhí)行指定的時(shí)間,讓出cpu該其他線程族操,但是它的監(jiān)控狀態(tài)依然保持者苛坚,當(dāng)指定的時(shí)間到了又會(huì)自動(dòng)恢復(fù)運(yùn)行狀態(tài)。在調(diào)用sleep()方法的過(guò)程中色难,線程不會(huì)釋放對(duì)象鎖泼舱。

??而當(dāng)調(diào)用wait()方法的時(shí)候,線程會(huì)放棄對(duì)象鎖枷莉,進(jìn)入等待此對(duì)象的等待鎖定池娇昙,只有針對(duì)此對(duì)象調(diào)用notify()方法后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備。
??

12依沮、notify()和notifyAll()的區(qū)別

notify():
??喚醒在次同步監(jiān)視器上等待的單個(gè)線程涯贞,如果所有線程都在此同步監(jiān)視器上等待,則會(huì)選擇喚醒其中一個(gè)線程危喉。

??選擇是任意性的宋渔。只有當(dāng)前線程放棄對(duì)該同步監(jiān)視器的鎖定后(使用wait()方法),才可以執(zhí)行被喚醒的線程

notifyAll():
??喚醒在此同步監(jiān)視器上等待的所有線程辜限。只有當(dāng)前線程放棄該同步監(jiān)視器的鎖定后皇拣,才可以執(zhí)行被喚醒的線程。
??

13、線程池的作用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氧急,一起剝皮案震驚了整個(gè)濱河市颗胡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吩坝,老刑警劉巖毒姨,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钉寝,居然都是意外死亡弧呐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)嵌纲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)俘枫,“玉大人,你說(shuō)我怎么就攤上這事逮走○剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵师溅,是天一觀的道長(zhǎng)茅信。 經(jīng)常有香客問(wèn)我,道長(zhǎng)险胰,這世上最難降的妖魔是什么汹押? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任矿筝,我火速辦了婚禮起便,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘窖维。我一直安慰自己榆综,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布铸史。 她就那樣靜靜地躺著鼻疮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琳轿。 梳的紋絲不亂的頭發(fā)上判沟,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音崭篡,去河邊找鬼挪哄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛琉闪,可吹牛的內(nèi)容都是我干的迹炼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼斯入!你這毒婦竟也來(lái)了砂碉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刻两,失蹤者是張志新(化名)和其女友劉穎增蹭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體磅摹,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沪铭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偏瓤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杀怠。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖厅克,靈堂內(nèi)的尸體忽然破棺而出赔退,到底是詐尸還是另有隱情,我是刑警寧澤证舟,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布硕旗,位于F島的核電站,受9級(jí)特大地震影響女责,放射性物質(zhì)發(fā)生泄漏漆枚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一抵知、第九天 我趴在偏房一處隱蔽的房頂上張望墙基。 院中可真熱鬧,春花似錦刷喜、人聲如沸残制。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)初茶。三九已至,卻和暖如春浊闪,著一層夾襖步出監(jiān)牢的瞬間恼布,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工搁宾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留折汞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓猛铅,卻偏偏與公主長(zhǎng)得像字支,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 線程概述 線程與進(jìn)程 進(jìn)程 ?每個(gè)運(yùn)行中的任務(wù)(通常是程序)就是一個(gè)進(jìn)程堕伪。當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí)揖庄,即變成了一個(gè)進(jìn)...
    閩越布衣閱讀 1,012評(píng)論 1 7
  • 下面是我自己收集整理的Java線程相關(guān)的面試題,可以用它來(lái)好好準(zhǔn)備面試欠雌。 參考文檔:-《Java核心技術(shù) 卷一》-...
    阿呆變Geek閱讀 14,859評(píng)論 14 507
  • 沒(méi)創(chuàng)業(yè)前是打工蹄梢,所以什么打工者的心態(tài)都見(jiàn)過(guò)也很熟悉了,現(xiàn)在換成老板也很好對(duì)癥下藥富俄。 員工無(wú)非三樣?xùn)|西禁炒,錢(qián),權(quán)霍比,情幕袱。...
    蔚藍(lán)的寧?kù)o閱讀 799評(píng)論 0 50
  • ?當(dāng)你有能力的時(shí)候浅妆,一定要狠踹生活望迎。 因?yàn)樯罱^不會(huì)因?yàn)槟隳懶∏优常裁吹亩紱](méi)干凌外,而饒了你辩尊。 奇葩說(shuō)里,一個(gè)22歲...
    封鈮閱讀 1,371評(píng)論 3 5
  • 流云鎮(zhèn)雖只是個(gè)小鎮(zhèn)康辑,偏居一隅摄欲,但勝在位置佳,身側(cè)便是源遠(yuǎn)流長(zhǎng)的清水河晾捏。在四處環(huán)繞的青山堆里蒿涎,走水路便尤為平順?lè)奖悖?..
    思依閱讀 657評(píng)論 3 3