我們都知道,在java中要想實(shí)現(xiàn)多線程,有兩種手段,一種是繼續(xù)Thread類,另外一種是實(shí)現(xiàn)Runable接口。 1.進(jìn)程和線程的區(qū)別是什么? 進(jìn)程是執(zhí)行著的應(yīng)用程序,而線程是進(jìn)程內(nèi)部的一個(gè)執(zhí)行序列。一個(gè)進(jìn)程可以有多個(gè)線程。線程又叫做輕量級(jí)進(jìn)程。 2.創(chuàng)建線程有幾種不同的方式?你喜歡哪一種?為什么?有三種方式可以用來創(chuàng)建線程:(1)繼承Thread類 (2)實(shí)現(xiàn)Runnable接口 (3)應(yīng)用程序可以使用Executor框架來創(chuàng)建線程池實(shí)現(xiàn)Runnable接口這種方式更受歡迎,因?yàn)檫@不需要繼承Thread類。在應(yīng)用設(shè)計(jì)中已經(jīng)繼承了別的對(duì)象的情況下,這需要多繼承(而Java不支持多繼承),只能實(shí)現(xiàn)接口。同時(shí),線程池也是非常高效的,很容易實(shí)現(xiàn)和使用。 3.概括的解釋下線程的幾種可用狀態(tài)。線程在執(zhí)行過程中,可以處于下面幾種狀態(tài): 就緒(Runnable):線程準(zhǔn)備運(yùn)行,不一定立馬就能開始執(zhí)行。 運(yùn)行中(Running):進(jìn)程正在執(zhí)行線程的代碼。 等待中(Waiting):線程處于阻塞的狀態(tài),等待外部的處理結(jié)束。 睡眠中(Sleeping):線程被強(qiáng)制睡眠。 I/O阻塞(Blocked on I/O):等待I/O操作完成。 同步阻塞(Blocked on Synchronization):等待獲取鎖。 死亡(Dead):線程完成了執(zhí)行。 4.同步方法和同步代碼塊的區(qū)別是什么? 在Java語言中,每一個(gè)對(duì)象有一把鎖。線程可以使用synchronized關(guān)鍵字來獲取對(duì)象上的鎖。synchronized關(guān)鍵字可應(yīng)用在方法級(jí)別(粗粒度鎖)或者是代碼塊級(jí)別(細(xì)粒度鎖)。 5.在監(jiān)視器(Monitor)內(nèi)部,是如何做線程同步的?程序應(yīng)該做哪種級(jí)別的同步? 監(jiān)視器和鎖在Java虛擬機(jī)中是一塊使用的。監(jiān)視器監(jiān)視一塊同步代碼塊,確保一次只有一個(gè)線程執(zhí)行同步代碼塊。每一個(gè)監(jiān)視器都和一個(gè)對(duì)象引用相關(guān)聯(lián)。線程在獲取鎖之前不允許執(zhí)行同步代碼。 6.什么是死鎖(deadlock)? 兩個(gè)進(jìn)程都在等待對(duì)方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時(shí)候就發(fā)生了死鎖。結(jié)果就是兩個(gè)進(jìn)程都陷入了無限的等待中。 7.如何確保N個(gè)線程可以訪問N個(gè)資源同時(shí)又不導(dǎo)致死鎖? 使用多線程的時(shí)候,一種非常簡單的避免死鎖的方式就是:指定獲取鎖的順序,并強(qiáng)制線程按照指定的順序獲取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會(huì)出現(xiàn)死鎖了。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注