日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

每日六道java新手入門面試題,通往自由的道路--多線程

瀏覽:260日期:2022-08-10 16:42:04
目錄1. 你可以講下進(jìn)程與線程的區(qū)別?為什么要用多線程?2. 什么是上下文切換?3. 說(shuō)說(shuō)你知道的幾種創(chuàng)建線程的方式4. 昨天你講到創(chuàng)建線程后使用start方法去調(diào)用線程,為什么run方法不行呢?有什么區(qū)別?5. 你知道你開(kāi)啟一個(gè)線程后,它的狀態(tài)有那些嗎?6. 既然講到超時(shí)方法,那你講下sleep和wait的區(qū)別和他們需要怎樣喚醒總結(jié):1. 你可以講下進(jìn)程與線程的區(qū)別?為什么要用多線程? 進(jìn)程:進(jìn)程是程序的一次執(zhí)行過(guò)程,是系統(tǒng)運(yùn)行程序的基本單位。 線程:?jiǎn)蝹€(gè)進(jìn)程中執(zhí)行中每個(gè)任務(wù)就是一個(gè)線程。線程是進(jìn)程中執(zhí)行運(yùn)算的最小單位。 區(qū)別: 一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程。一個(gè)線程只能屬于一個(gè)進(jìn)程,但是一個(gè)進(jìn)程可以擁有多個(gè)線程。多線程處理就是允許一個(gè)進(jìn)程中在同一時(shí)刻執(zhí)行多個(gè)任務(wù)即多個(gè)線程。每個(gè)獨(dú)立的進(jìn)程有程序運(yùn)行的入口、順序執(zhí)行序列和程序出口。但是線程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制,兩者均可并發(fā)執(zhí)行

為什么要用多線程:

發(fā)揮多核CPU的優(yōu)勢(shì),采用多線程的方式去同時(shí)完成幾件事情而不互相干擾。 能夠有效的防止阻塞,多條線程同時(shí)運(yùn)行,哪怕一條線程的代碼執(zhí)行讀取數(shù)據(jù)阻塞,也不會(huì)影響其它任務(wù)的執(zhí)行。 提高程序的效率。2. 什么是上下文切換?

上下文切換一般發(fā)生在多線程情況下,因?yàn)橐粋€(gè) CPU 核心在任意時(shí)刻只能被一個(gè)線程使用,為了讓這些線程都能得到有效執(zhí)行,CPU 采取的策略是為每個(gè)線程分配時(shí)間片并輪轉(zhuǎn)的形式。而在多核cpu下,多線程是并行工作的,如果線程數(shù)多,單個(gè)核又會(huì)并發(fā)的調(diào)度線程,運(yùn)行時(shí)就會(huì)讓一個(gè)線程的時(shí)間片用完的時(shí)候就會(huì)重新處于就緒狀態(tài)讓給其他線程使用,這個(gè)過(guò)程就屬于上下文切換。

對(duì)于我們Java程序線程來(lái)說(shuō),一旦一個(gè)線程搶占到CPU資源的使用權(quán)后,另一個(gè)線程需要保存當(dāng)前的一個(gè)狀態(tài),以便下次搶占成功后可以回到當(dāng)前狀態(tài),JVM中有塊內(nèi)存地址叫程序計(jì)數(shù)器,用于記錄保存線程執(zhí)行到哪一行代碼,它是每個(gè)線程獨(dú)有的。執(zhí)行任務(wù)從保存到再次加載的過(guò)程就是上下文切換。

實(shí)際上,上下文切換也是對(duì)系統(tǒng)意味著來(lái)說(shuō)會(huì)消耗大量的CPU時(shí)間,消耗大量資源。

以下幾種情況會(huì)發(fā)生上下文切換。

線程的cpu時(shí)間片用完 在發(fā)生垃圾回收的時(shí)候 我們自己調(diào)用了 sleep、yield、wait、join、synchronized、lock 等方法3. 說(shuō)說(shuō)你知道的幾種創(chuàng)建線程的方式

創(chuàng)建線程有以下方式:

繼承Thread類,重載它的run方法。

在我們自己定義一個(gè)繼承于Thread類的子類,并重寫里面run方法,編寫相關(guān)邏輯代碼。 在測(cè)試類中創(chuàng)建我剛自定義的線程子類對(duì)象 調(diào)用子類實(shí)例的star方法來(lái)啟動(dòng)線程,通過(guò)start方法去調(diào)用到run方法里面的邏輯。

實(shí)現(xiàn) Runnalbe接口,重載 Runnalbe接口中的run方法實(shí)現(xiàn) 。

我們定義一個(gè)實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)類,并重寫里面的run方法 在測(cè)試類中創(chuàng)建一個(gè)我們剛定義的接口實(shí)現(xiàn)類的實(shí)例,以實(shí)例對(duì)象作為target創(chuàng)建Thead對(duì)象,而得到的Thread對(duì)象就是我們線程子類對(duì)象。 最后調(diào)用線程對(duì)象的start方法

實(shí)現(xiàn)Callable接口方式,重寫Callable接口中的call方法,并且這個(gè)call方法可以有返回值。

我們定義一個(gè)實(shí)現(xiàn)創(chuàng)建實(shí)現(xiàn)Callable接口實(shí)現(xiàn)類,并重寫里面的call方法,注意它是call方法,并且有返回值。 在測(cè)試類中創(chuàng)建一個(gè)我們剛定義的接口實(shí)現(xiàn)類的實(shí)例,以實(shí)例對(duì)象為參數(shù)創(chuàng)建FutureTask對(duì)象,并把創(chuàng)建出來(lái)FutureTask對(duì)象作為參數(shù)去創(chuàng)建Thread對(duì)象,而得到的Thread對(duì)象就是我們線程子類對(duì)象。 最好調(diào)用線程對(duì)象的start方法。

需要注意三者的區(qū)別:

Thread是繼承,而Runnalbe、Callable是實(shí)現(xiàn)。對(duì)于繼承來(lái)說(shuō),只能單繼承,而接口可以多實(shí)現(xiàn)。如果繼承了 Thread類就無(wú)法再繼承其他類了。 三者都是最后采用Thread.start()去啟動(dòng)線程,而不是調(diào)用run方法,或者call方法的。 Runnable接口 run 方法無(wú)返回值;Callable接口 call 方法有返回值。 Runnable 接口 run 方法只能拋出運(yùn)行時(shí)異常,且無(wú)法捕獲處理;Callable 接口 call 方法允許拋出異常,可以獲取異常信息 使用實(shí)現(xiàn) Runnable接口的方式創(chuàng)建的線程可以處理同一資源,而實(shí)現(xiàn)資源的共享,還可以繼承其他類。4. 昨天你講到創(chuàng)建線程后使用start方法去調(diào)用線程,為什么run方法不行呢?有什么區(qū)別?

我們先來(lái)看看代碼吧。

public class ThreadDemo { public static void main(String[] args) {MyThread myThread = new MyThread();MyThread myThead2 = new MyThread();//myThread.start();//myThead2.start();myThread.run();myThead2.run(); }}class MyThread extends Thread { @Override public void run() {for (int i = 0; i < 6; i++) { System.out.println(Thread.currentThread().getName() + ' :' + i); try {sleep(100); } catch (InterruptedException e) {e.printStackTrace(); }} }}

這里我們創(chuàng)建了MyThread繼承了Thread類,這種方法是一種可以創(chuàng)建線程的方式。接著我們?cè)趍ain方法中創(chuàng)建了兩個(gè)線程,都調(diào)用了start方法和run方法。讓我們先看看結(jié)果吧!

// 注釋掉兩個(gè)run方法 開(kāi)啟start方法得到的結(jié)果Thread-0 :0Thread-1 :0Thread-1 :1Thread-0 :1Thread-1 :2Thread-0 :2Thread-1 :3Thread-0 :3Thread-1 :4Thread-0 :4Thread-1 :5Thread-0 :5

// 注釋掉兩個(gè)start方法 開(kāi)啟run方法得到的結(jié)果main :0main :1main :2main :3main :4main :5main :0main :1main :2main :3main :4main :5

接下來(lái)我們講一下:

1.start方法的作用:

啟動(dòng)線程,相當(dāng)于開(kāi)啟一個(gè)線程調(diào)用我們重寫的run方法里面的邏輯,此時(shí)相當(dāng)于有兩個(gè)線程,一個(gè)main的主線程和開(kāi)啟的子線程。可以看到我們的代碼,相當(dāng)于有三個(gè)線程,一個(gè)主線程、一個(gè)Thread-0線程和一個(gè)Thread-1線程。并且線程之間是沒(méi)有順序的,他們是搶占cpu的資源來(lái)回切換的。

2.run方法的作用:

執(zhí)行線程的運(yùn)行時(shí)代碼,相當(dāng)于我們只是單純的調(diào)用一個(gè)普通方法。然后通過(guò)主線程的順序調(diào)用的方式,從myThread調(diào)用run方法結(jié)束后到myThread2去調(diào)用run方法結(jié)束,并且我們也可以看到我們控制臺(tái)中的線程名字就是main主線程。

3.run方法我們可以重復(fù)調(diào)用,而start方法在一個(gè)線程中只能調(diào)用一次。即myThread這個(gè)實(shí)例對(duì)象只能調(diào)用一次start方法,如果再調(diào)用一次start方法的話,就會(huì)拋出IllegalThreadStateException 的異常。

4.我們調(diào)用start方法算是真正意義上的多線程,因?yàn)樗穷~外開(kāi)啟一個(gè)子線程去調(diào)用我們的run方法了。如果我們是調(diào)用run方法,就需要等待上一次的run方法執(zhí)行完畢才能調(diào)用下一次。所以我們要調(diào)用start方法充分揮多核CPU的優(yōu)勢(shì),采用多線程的方式去同時(shí)完成幾件事情而不互相干擾。

5. 你知道你開(kāi)啟一個(gè)線程后,它的狀態(tài)有那些嗎?

我們可以通過(guò)查看Thread的源碼中State枚舉發(fā)現(xiàn)有6個(gè)狀態(tài):

public enum State {/** * Thread state for a thread which has not yet started. */NEW,/** * Thread state for a runnable thread. A thread in the runnable * state is executing in the Java virtual machine but it may * be waiting for other resources from the operating system * such as processor. */RUNNABLE,/** * Thread state for a thread blocked waiting for a monitor lock. * A thread in the blocked state is waiting for a monitor lock * to enter a synchronized block/method or * reenter a synchronized block/method after calling * {@link Object#wait() Object.wait}. */BLOCKED,/** * Thread state for a waiting thread. * A thread is in the waiting state due to calling one of the * following methods: * <ul> * <li>{@link Object#wait() Object.wait} with no timeout</li> * <li>{@link #join() Thread.join} with no timeout</li> * <li>{@link LockSupport#park() LockSupport.park}</li> * </ul> * * <p>A thread in the waiting state is waiting for another thread to * perform a particular action. * * For example, a thread that has called <tt>Object.wait()</tt> * on an object is waiting for another thread to call * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on * that object. A thread that has called <tt>Thread.join()</tt> * is waiting for a specified thread to terminate. */WAITING,/** * Thread state for a waiting thread with a specified waiting time. * A thread is in the timed waiting state due to calling one of * the following methods with a specified positive waiting time: * <ul> * <li>{@link #sleep Thread.sleep}</li> * <li>{@link Object#wait(long) Object.wait} with timeout</li> * <li>{@link #join(long) Thread.join} with timeout</li> * <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li> * <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li> * </ul> */TIMED_WAITING,/** * Thread state for a terminated thread. * The thread has completed execution. */TERMINATED; }

接下來(lái)我們具體來(lái)說(shuō)說(shuō)吧:

NEW(新建)

線程剛被創(chuàng)建,還只是一個(gè)實(shí)例對(duì)象,并未調(diào)用start方法啟動(dòng)。。MyThread myThread = new MyThread只有線程對(duì)象,沒(méi)有線程特征。

Runnable(可運(yùn)行)

在創(chuàng)建對(duì)象對(duì)象完成后,調(diào)用了myThread.start()方法線程,可以在Java虛擬機(jī)中運(yùn)行的狀態(tài),可能正在運(yùn)行自己代碼,也可能沒(méi)有,這取決于操作系統(tǒng)處理器。也可以叫做處于就緒狀態(tài),需要等待被線程調(diào)度選中,獲取cpu資源的使用權(quán)。

Teminated(被終止)

因?yàn)閞un方法正常退出而死亡,或者因?yàn)闆](méi)有捕獲的異常終止了run方法而死亡。代表著此線程的生命周期結(jié)束了。

處于運(yùn)行狀態(tài)中的線程由于某種原因,暫時(shí)放棄對(duì) CPU的使用權(quán),停止執(zhí)行,此時(shí)進(jìn)入阻塞狀態(tài),直到其進(jìn)入到就緒狀態(tài),才 有機(jī)會(huì)再次被 CPU 調(diào)用以進(jìn)入到運(yùn)行狀態(tài)。有以下三種相關(guān)阻塞狀態(tài):

Blocked(鎖阻塞)

當(dāng)一個(gè)線程試圖獲取一個(gè)對(duì)象鎖如(Synchronzied或Lock),而該對(duì)象鎖被其他的線程持有,則該線程進(jìn)入Blocked狀態(tài);只有當(dāng)該線程持有鎖時(shí),該線程將變成Runnable狀態(tài)。

Waiting(無(wú)限等待)

在調(diào)用了wait方法,JVM會(huì)把該線程放入等待隊(duì)列中,等待另一個(gè)線程執(zhí)行一個(gè)(喚醒),該線程此時(shí)狀態(tài)表示進(jìn)入Waiting狀態(tài)。進(jìn)入這個(gè)狀態(tài)后是不能自動(dòng)喚醒的,必須等待另一個(gè)線程調(diào)用notify或者notifyAll方法才能夠喚醒。

TimedWaiting(計(jì)時(shí)等待)

同waiting狀態(tài)一樣,調(diào)用sleep方法或者其他超時(shí)方法時(shí),他們將進(jìn)入Timed Waiting狀態(tài)。不過(guò)這一狀態(tài)只需保持到超時(shí)期滿或者接收到喚醒通知。

每日六道java新手入門面試題,通往自由的道路--多線程

6. 既然講到超時(shí)方法,那你講下sleep和wait的區(qū)別和他們需要怎樣喚醒

sleep和wait方法他們都是可以暫停當(dāng)前線程的執(zhí)行,進(jìn)入一個(gè)阻塞狀態(tài)。

sleep:

我們可以指定睡眠時(shí)間,即讓程序暫停指定時(shí)間運(yùn)行,時(shí)間到了會(huì)繼續(xù)執(zhí)行代碼,如果時(shí)間未到我們想要換醒需要調(diào)用interrupt 方法來(lái)隨時(shí)喚醒即可。而調(diào)用interrupt 會(huì)使得sleep()方法拋出InterruptedException 異常,當(dāng)sleep()方法拋出異常我們就中斷了sleep的方法,從而讓程序繼續(xù)運(yùn)行下去。

wait:

調(diào)用該方法,可以導(dǎo)致線程進(jìn)入等待阻塞狀態(tài),會(huì)一直等待直到它被其他線程通過(guò)notify或者notifyAll方法喚醒。或者也可以使用wait(long timeout)表示時(shí)間到了自動(dòng)執(zhí)行,類似于sleep(long millis)。

notify():該方法會(huì)隨機(jī)選擇一個(gè)在該對(duì)象上調(diào)用wait方法的線程,解除其阻塞狀態(tài)。

notifyAll():該方法會(huì)喚醒所有的wait對(duì)象。

兩者的區(qū)別:

兩者所屬的類不同:sleep是 Thread線程類的靜態(tài)方法;而wait是 Object類的方法。 兩者是否是否鎖呢:sleep不釋放鎖;wait釋放鎖。 兩者所使用的場(chǎng)景:sleep可以在任何需要的場(chǎng)景下調(diào)用;而wait必須使用在同步代碼塊或者同步方法中。 兩者不同喚醒機(jī)制:sleep方法執(zhí)行睡眠時(shí)間完成后,線程會(huì)自動(dòng)蘇醒;而wait方法被調(diào)用后,線程不會(huì)自動(dòng)蘇醒,需要?jiǎng)e的線程調(diào)用同一個(gè)對(duì)象上的 notify或者 notifyAll方法,或者可以使用wait(long timeout)超時(shí)后線程會(huì)自動(dòng)蘇醒。總結(jié):

這篇文章就到這里了,如果這篇文章對(duì)你也有所幫助,希望您能多多關(guān)注好吧啦網(wǎng)的更多內(nèi)容!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品高清一区二区| 88久久精品| 国产成人在线中文字幕| 青草国产精品| 日韩精彩视频在线观看| 老鸭窝亚洲一区二区三区| 亚洲午夜久久久久久尤物| 欧美日韩国产观看视频| 成人在线黄色| 国产精品成久久久久| 精品黄色一级片| 久久影院资源站| 免费在线播放第一区高清av| 久久丁香四色| 精品黄色一级片| 精品国产亚洲一区二区三区大结局| 综合国产精品| 亚洲美女91| 青青草91久久久久久久久| 日本精品一区二区三区在线观看视频| 免费视频最近日韩| 蜜桃传媒麻豆第一区在线观看| 免费国产自线拍一欧美视频| 巨乳诱惑日韩免费av| 亚洲精品成人一区| 97成人超碰| 国产精久久久| 97精品一区二区| 91精品精品| 日韩午夜av在线| 日本欧美在线看| 首页亚洲欧美制服丝腿| 亚州av日韩av| 欧美国产极品| 偷拍精品精品一区二区三区| 欧美日韩国产探花| 亚洲精品少妇| 国产亚洲久久| 波多视频一区| 在线亚洲自拍| 日韩高清在线不卡| 国产第一亚洲| 在线一区欧美| 国产九九精品| 天堂√8在线中文| 黄色成人91| 亚洲a成人v| 福利视频一区| 亚洲欧美日本日韩| 涩涩涩久久久成人精品| 国产精品一区二区三区美女 | 日本一区福利在线| 免费在线成人| 欧美日韩视频免费观看| 午夜国产精品视频免费体验区| 亚洲精品影视| 亚洲精品成人图区| 亚洲涩涩av| 国产精品日本一区二区三区在线| 蜜桃av.网站在线观看| 男女激情视频一区| 国产成人精选| 亚洲天堂免费| 91综合网人人| 亚洲欧美一级| 日韩av有码| 在线一区二区三区视频| 成人国产精品久久| 只有精品亚洲| 中文av在线全新| 天海翼亚洲一区二区三区| 中文字幕在线高清| 亚洲三级在线| 国产一区二区三区亚洲综合| 久久最新视频| 日韩欧美看国产| 911亚洲精品| 中文精品视频| 国产乱码午夜在线视频| 91欧美精品| 伊人久久成人| 在线看片福利| 国产精品入口久久| 免费日本视频一区| 成人国产综合| 久久精品97| 另类国产ts人妖高潮视频| 精品久久久亚洲| 日韩在线a电影| 香蕉久久99| 狠狠久久伊人| 88久久精品| 亚洲一区日本| 久久九九国产| 精品久久网站| 久久精品超碰| 亚洲ww精品| 野花国产精品入口| 久久久成人网| 精品美女久久| 久久国产精品免费精品3p| 午夜亚洲一区| 久久九九精品| 久久伊人亚洲| 久久精品99国产精品| 蜜臀av一区二区在线免费观看| 亚洲二区在线| 国产一区二区精品福利地址| 欧美一区免费| 国产毛片一区| 婷婷丁香综合| 激情欧美丁香| 亚洲最大av| 在线看片不卡| 久久久天天操| 色乱码一区二区三区网站| 91精品国产自产观看在线| 亚洲精品无播放器在线播放| 91精品国产乱码久久久久久久| 美女视频黄久久| 欧美一区二区三区久久精品| 蜜臀久久99精品久久久久久9 | 69精品国产久热在线观看| 久久免费影院| 亚洲开心激情| 亚洲高清毛片| 蜜桃视频在线网站| 黄色在线网站噜噜噜| 欧美韩一区二区| 久久不卡日韩美女| 精品国产99| 精品72久久久久中文字幕| 欧美永久精品| 国产精品一区二区三区美女 | 六月天综合网| 91成人精品| 欧美成人久久| 亚洲免费成人| 蜜桃视频在线观看一区| 亚洲欧洲国产精品一区| 日本不卡在线视频| 婷婷成人av| 91麻豆精品激情在线观看最新| 久久精品99国产精品| 国产精品高清一区二区| 91欧美在线| 精品在线91| 伊人久久一区| 国产乱码精品一区二区亚洲| 精品理论电影在线| 欧美中文字幕一区二区| 99国产精品久久久久久久| 亚洲资源在线| 国产免费av国片精品草莓男男| 精品香蕉视频| 成人精品天堂一区二区三区| 久久国产中文字幕| 婷婷综合亚洲| 中文字幕日韩高清在线| 国产精品嫩草影院在线看| 精品资源在线| 成人免费网站www网站高清| 欧美日韩激情| 婷婷亚洲精品| 精品美女久久| 国产高清一区| 亚洲久草在线| 久久精品伊人| 国产一区清纯| 欧美在线看片| 综合日韩av| 免费欧美在线视频| 日韩av二区在线播放| 国产96在线亚洲| 国产模特精品视频久久久久| 日本免费在线视频不卡一不卡二| 精品一区二区三区中文字幕视频 | 亚洲免费高清| 国产探花一区| 色婷婷精品视频| 视频一区日韩精品| 国产a亚洲精品| 视频一区在线播放| 久久影院资源站| 伊人久久大香线蕉av不卡| 日韩精品视频网站| 中文字幕在线看片| 免费成人在线视频观看| 精品黄色一级片| 国产精品日本欧美一区二区三区| 国产精品亚洲综合在线观看| 成人羞羞视频播放网站| 亚洲免费观看高清完整版在线观| 日本久久黄色| 亚洲精品乱码日韩| 国产在线|日韩| 欧美偷窥清纯综合图区| 影视先锋久久| 欧美极品一区二区三区| 欧美日韩精品免费观看视频完整|