更新時間:2019-01-30 09:56:35 來源:動力節(jié)點 瀏覽5765次
進程和線程之間有什么不同?
一個進程是一個獨立(selfcontained)的運行環(huán)境,它可以被看作一個程序或者一個應用。而線程是在進程中執(zhí)行的一個任務。Java運行環(huán)境是一個包含了不同的類和程序的單一進程。線程可以被稱為輕量級進程。線程需要較少的資源來創(chuàng)建和駐留在進程中,并且可以共享進程中的資源。
多線程編程的好處是什么?
在多線程程序中,多個線程被并發(fā)的執(zhí)行以提高程序的效率,CPU不會因為某個線程需要等待資源而進入空閑狀態(tài)。多個線程共享堆內(nèi)存(heapmemory),因此創(chuàng)建多個線程去執(zhí)行一些任務會比創(chuàng)建多個進程更好。舉個例子,Servlets比CGI更好,是因為Servlets支持多線程而CGI不支持。
用戶線程和守護線程有什么區(qū)別?
當我們在Java程序中創(chuàng)建一個線程,它就被稱為用戶線程。一個守護線程是在后臺執(zhí)行并且不會阻止JVM終止的線程。當沒有用戶線程在運行的時候,JVM關(guān)閉程序并且退出。一個守護線程創(chuàng)建的子線程依然是守護線程。
我們?nèi)绾蝿?chuàng)建一個線程?
有兩種創(chuàng)建線程的方法:一是實現(xiàn)Runnable接口,然后將它傳遞給Thread的構(gòu)造函數(shù),創(chuàng)建一個Thread對象;二是直接繼承Thread類。
有哪些不同的線程生命周期?
當我們在Java程序中新建一個線程時,它的狀態(tài)是New。當我們調(diào)用線程的start()方法時,狀態(tài)被改變?yōu)镽unnable。線程調(diào)度器會為Runnable線程池中的線程分配CPU時間并且講它們的狀態(tài)改變?yōu)镽unning。其他的線程狀態(tài)還有Waiting,Blocked和Dead。讀這篇文章可以了解更多關(guān)于線程生命周期的知識。
可以直接調(diào)用Thread類的run()方法么?
當然可以,但是如果我們調(diào)用了Thread的run()方法,它的行為就會和普通的方法一樣,為了在新的線程中執(zhí)行我們的代碼,必須使用Thread.start()方法。
如何讓正在運行的線程暫停一段時間?
我們可以使用Thread類的Sleep()方法讓線程暫停一段時間。需要注意的是,這并不會讓線程終止,一旦從休眠中喚醒線程,線程的狀態(tài)將會被改變?yōu)镽unnable,并且根據(jù)線程調(diào)度,它將得到執(zhí)行。
你對線程優(yōu)先級的理解是什么?
每一個線程都是有優(yōu)先級的,一般來說,高優(yōu)先級的線程在運行時會具有優(yōu)先權(quán),但這依賴于線程調(diào)度的實現(xiàn),這個實現(xiàn)是和操作系統(tǒng)相關(guān)的(OSdependent)。我們可以定義線程的優(yōu)先級,但是這并不能保證高優(yōu)先級的線程會在低優(yōu)先級的線程前執(zhí)行。線程優(yōu)先級是一個int變量(從1-10),1代表最低優(yōu)先級,10代表最高優(yōu)先級。
什么是線程調(diào)度器和時間分片?
線程調(diào)度器是一個操作系統(tǒng)服務,它負責為Runnable狀態(tài)的線程分配CPU時間。一旦我們創(chuàng)建一個線程并啟動它,它的執(zhí)行便依賴于線程調(diào)度器的實現(xiàn)。時間分片是指將可用的CPU時間分配給可用的Runnable線程的過程。分配CPU時間可以基于線程優(yōu)先級或者線程等待的時間。線程調(diào)度并不受到Java虛擬機控制,所以由應用程序來控制它是更好的選擇(也就是說不要讓你的程序依賴于線程的優(yōu)先級)。
在多線程中,什么是上下文切換?
上下文切換是存儲和恢復CPU狀態(tài)的過程,它使得線程執(zhí)行能夠從中斷點恢復執(zhí)行。上下文切換是多任務操作系統(tǒng)和多線程環(huán)境的基本特征。
關(guān)注“動力節(jié)點IT培訓官網(wǎng)”資訊內(nèi)容,獲取更多最新Java編程技術(shù)及面試題總結(jié)。