1. 程式人生 > >關於多執行緒的幾個問題(面試小問題,Java篇)

關於多執行緒的幾個問題(面試小問題,Java篇)

面試官想考考我多執行緒方面的問題。

1、請說下執行緒與程序的關係。

答:《作業系統》中是這樣說的

(1)一個執行緒只能屬於一個程序,而一個程序可以有多個執行緒,但至少有一個執行緒。執行緒是作業系統可識別的最小執行和排程單位。

(2)資源分配給程序,同一程序的所有執行緒共享該程序的所有資源。同一程序中的多個執行緒共享程式碼段(程式碼和常量),資料段(全域性變數和靜態變數),擴充套件段(堆儲存)。但是每個執行緒擁有自己的棧段,棧段又叫執行時段,用來存放所有區域性變數和臨時變數。

(3)處理機分給執行緒,即真正在處理機上執行的是執行緒。

(4)執行緒在執行過程中,需要協作同步。不同程序的執行緒間要利用訊息通訊的辦法實現同步。

2、請說下執行緒池的概念。

答:執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後自動啟動這些任務。執行緒池執行緒都是後臺執行緒。每個執行緒都使用預設的堆疊大小,以預設的優先順序執行,並處於多執行緒單元中。如果某個執行緒在託管程式碼中空閒(如正在等待某個事件),則執行緒池將插入另一個輔助執行緒來使所有處理器保持繁忙。如果所有執行緒池執行緒都始終保持繁忙,但佇列中包含掛起的工作,則執行緒池將在一段時間後建立另一個輔助執行緒但執行緒的數目永遠不會超過最大值。超過最大值的執行緒可以排隊,但他們要等到其他執行緒完成後才啟動。

3、請說下NIO與多執行緒Socket區別

答:這個問題就是在問NIO與BIO、AIO的區別。

IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO(Selector模型)、非同步非阻塞的AIO。

BIO是一個連線一個執行緒。

NIO是一個請求一個執行緒。

AIO是一個有效請求一個執行緒。

傳統的socket IO中,需要為每個連線建立一個執行緒,當併發的連線數量非常巨大時,執行緒所佔用的棧記憶體和CPU執行緒切換的開銷將非常巨大。使用NIO,不再需要為每個執行緒建立單獨的執行緒,可以用一個含有限數量執行緒的執行緒池,甚至一個執行緒來為任意數量的連線服務。由於執行緒數量小於連線數量,所以每個執行緒進行IO操作時就不能阻塞,如果阻塞的話,有些連線就得不到處理,NIO提供了這種非阻塞的能力。參考

http://blog.csdn.net/zhouhl_cn/article/details/6568119