电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

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

為什么要用多線程:

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

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

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

實際上,上下文切換也是對系統意味著來說會消耗大量的CPU時間,消耗大量資源。

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

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

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

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

在我們自己定義一個繼承于Thread類的子類,并重寫里面run方法,編寫相關邏輯代碼。 在測試類中創(chuàng)建我剛自定義的線程子類對象 調用子類實例的star方法來啟動線程,通過start方法去調用到run方法里面的邏輯。

實現 Runnalbe接口,重載 Runnalbe接口中的run方法實現 。

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

實現Callable接口方式,重寫Callable接口中的call方法,并且這個call方法可以有返回值。

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

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

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

我們先來看看代碼吧。

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)建線程的方式。接著我們在main方法中創(chuàng)建了兩個線程,都調用了start方法和run方法。讓我們先看看結果吧!

// 注釋掉兩個run方法 開啟start方法得到的結果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

// 注釋掉兩個start方法 開啟run方法得到的結果main :0main :1main :2main :3main :4main :5main :0main :1main :2main :3main :4main :5

接下來我們講一下:

1.start方法的作用:

啟動線程,相當于開啟一個線程調用我們重寫的run方法里面的邏輯,此時相當于有兩個線程,一個main的主線程和開啟的子線程。可以看到我們的代碼,相當于有三個線程,一個主線程、一個Thread-0線程和一個Thread-1線程。并且線程之間是沒有順序的,他們是搶占cpu的資源來回切換的。

2.run方法的作用:

執(zhí)行線程的運行時代碼,相當于我們只是單純的調用一個普通方法。然后通過主線程的順序調用的方式,從myThread調用run方法結束后到myThread2去調用run方法結束,并且我們也可以看到我們控制臺中的線程名字就是main主線程。

3.run方法我們可以重復調用,而start方法在一個線程中只能調用一次。即myThread這個實例對象只能調用一次start方法,如果再調用一次start方法的話,就會拋出IllegalThreadStateException 的異常。

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

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

我們可以通過查看Thread的源碼中State枚舉發(fā)現有6個狀態(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; }

接下來我們具體來說說吧:

NEW(新建)

線程剛被創(chuàng)建,還只是一個實例對象,并未調用start方法啟動。。MyThread myThread = new MyThread只有線程對象,沒有線程特征。

Runnable(可運行)

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

Teminated(被終止)

因為run方法正常退出而死亡,或者因為沒有捕獲的異常終止了run方法而死亡。代表著此線程的生命周期結束了。

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

Blocked(鎖阻塞)

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

Waiting(無限等待)

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

TimedWaiting(計時等待)

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

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

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

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

sleep:

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

wait:

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

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

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

兩者的區(qū)別:

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

這篇文章就到這里了,如果這篇文章對你也有所幫助,希望您能多多關注好吧啦網的更多內容!

標簽: Java
相關文章:
主站蜘蛛池模板: 全球化工设备网—化工设备,化工机械,制药设备,环保设备的专业网络市场。 | 校服厂家,英伦校服定做工厂,园服生产定制厂商-东莞市艾咪天使校服 | loft装修,上海嘉定酒店式公寓装修公司—曼城装饰 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 软瓷_柔性面砖_软瓷砖_柔性石材_MCM软瓷厂家_湖北博悦佳软瓷 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | ALC墙板_ALC轻质隔墙板_隔音防火墙板_轻质隔墙材料-湖北博悦佳 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 淄博不锈钢无缝管,淄博不锈钢管-鑫门物资有限公司 | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 主题班会网 - 安全教育主题班会,各类主题班会PPT模板 | 自动钻孔机-全自动数控钻孔机生产厂家-多米(广东)智能装备有限公司 | 精密线材测试仪-电线电缆检测仪-苏州欣硕电子科技有限公司 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 自动化改造_智虎机器人_灌装机_贴标机-上海圣起包装机械 | 立式_复合式_壁挂式智能化电伴热洗眼器-上海达傲洗眼器生产厂家 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 智能家居全屋智能系统多少钱一套-小米全套价格、装修方案 | TYPE-C厂家|TYPE-C接口|TYPE-C防水母座|TYPE-C贴片-深圳步步精 | 江西自考网| 脉冲布袋除尘器_除尘布袋-泊头市净化除尘设备生产厂家 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 亚克力制品定制,上海嘉定有机玻璃加工制作生产厂家—官网 | 工控机-图像采集卡-PoE网卡-人工智能-工业主板-深圳朗锐智科 | 高压分散机(高压细胞破碎仪)百科-北京天恩瀚拓 | 清洁设备_洗地机/扫地机厂家_全自动洗地机_橙犀清洁设备官网 | 维泰克Veertek-锂电池微短路检测_锂电池腐蚀检测_锂电池漏液检测 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 超声波乳化机-超声波分散机|仪-超声波萃取仪-超声波均质机-精浩机械|首页 | 荣事达手推洗地机_洗地机厂家_驾驶式扫地机_工业清洁设备 | 电缆接头_防水接头_电缆防水接头 - 乐清市新豪电气有限公司 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 书法培训-高考书法艺考培训班-山东艺霖书法培训凭实力挺进央美 | 炉门刀边腹板,焦化设备配件,焦化焦炉设备_沧州瑞创机械制造有限公司 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 集装箱箱号识别_自重载重图像识别_铁路车号自动识别_OCR图像识别 | 华东师范大学在职研究生招生网_在职研究生招生联展网 |