首頁技術(shù)文章正文

Java中如何創(chuàng)建線程?【Java面試題】

更新時(shí)間:2020-09-29 來源:黑馬程序員 瀏覽量:

(1)問題分析:

考官主要想對線程方面的考核,如線程的生命周期、線程安全問題等。

(2)核心答案講解

通過繼承Thread類實(shí)現(xiàn),多個(gè)線程之間無法共享該線程類的實(shí)例變量。

實(shí)現(xiàn)Runnable接口,較繼承Thread類,避免繼承的局限性,適合資源共享。

使用Callable,方法中可以有返回值,并且拋出異常。

創(chuàng)建線程池實(shí)現(xiàn),線程池提供了一個(gè)線程隊(duì)列,隊(duì)列中保存所有等待狀態(tài)的線程,避免創(chuàng)建與銷毀額外開銷,提高了響應(yīng)速度。

(3)問題擴(kuò)展:

線程的生命周期:線程要經(jīng)歷新建、就緒、運(yùn)行(活動(dòng))、阻塞和死亡五種不同的狀態(tài)。這五種狀態(tài)都可以通過Thread類中的方法進(jìn)行控制。
① 新建狀態(tài):使用new 操作符創(chuàng)建一個(gè)線程后,該線程僅僅是一個(gè)空對象,這時(shí)的線程處于創(chuàng)建狀態(tài)。
② 就緒狀態(tài):使用start()方法啟動(dòng)一個(gè)線程后,系統(tǒng)為該線程分配了除CPU外的所需資源,使該線程處于就緒狀態(tài)。
③ 運(yùn)行狀態(tài):系統(tǒng)真正執(zhí)行線程的run()方法。
④ 阻塞和喚醒線程阻塞狀態(tài):使用sleep(),wait()方法進(jìn)行操作。
⑤ 死亡狀態(tài):線程執(zhí)行了interrupt()或stop()方法,那么它也會以異常退出的方式進(jìn)入死亡狀態(tài)。

線程安全問題:使用synchronized聲明同步或使用鎖lock,Lock使用起來比較靈活,但需要手動(dòng)釋放和開啟,采用synchronized不需要用戶去手動(dòng)釋放鎖。

(4)結(jié)合項(xiàng)目中使用:

模擬實(shí)現(xiàn)銀行業(yè)務(wù)調(diào)度系統(tǒng)邏輯,具體需求如下:

1)銀行內(nèi)有6個(gè)業(yè)務(wù)窗口,1 - 4號窗口為普通窗口,5號窗口為快速窗口,6號窗口為VIP窗口。

2)有三種對應(yīng)類型的客戶:VIP客戶,普通客戶,快速客戶(辦理如交水電費(fèi)、電話費(fèi)之類業(yè)務(wù)的客戶)。

3)異步隨機(jī)生成各種類型的客戶,生成各類型用戶的概率比例為:VIP客戶 :普通客戶 :快速客戶 = 1 :6 :3。

4)客戶辦理業(yè)務(wù)所需時(shí)間有最大值和最小值,在該范圍內(nèi)隨機(jī)設(shè)定每個(gè)VIP客戶以及普通客戶辦理業(yè)務(wù)所需的時(shí)間,快速客戶辦理業(yè)務(wù)所需時(shí)間為最小值(提示:辦理業(yè)務(wù)的過程可通過線程Sleep的方式模擬)。

5)各類型客戶在其對應(yīng)窗口按順序依次辦理業(yè)務(wù)。

6)當(dāng)VIP(6號)窗口和快速業(yè)務(wù)(5號)窗口沒有客戶等待辦理業(yè)務(wù)的時(shí)候,這兩個(gè)窗口可以處理普通客戶的業(yè)務(wù),而一旦有對應(yīng)的客戶等待辦理業(yè)務(wù)的時(shí)候,則優(yōu)先處理對應(yīng)客戶的業(yè)務(wù)。

7)隨機(jī)生成客戶時(shí)間間隔以及業(yè)務(wù)辦理時(shí)間最大值和最小值自定,可以設(shè)置。

8)不要求實(shí)現(xiàn)GUI,只考慮系統(tǒng)邏輯實(shí)現(xiàn),可通過Log方式展現(xiàn)程序運(yùn)行結(jié)果。

猜你喜歡:

單例模式介紹:懶漢和餓漢代碼

JavaSE線程池超全視頻教程 

Swing頂級容器:JFrame和JDialog介紹 

realm中怎么使用散列算法? 

Java高級軟件工程師課程 



分享到:
在線咨詢 我要報(bào)名
和我們在線交談!