我們都知道,在java中要想實現多線程,有兩種手段,一種是繼續Thread類,另外一種是實現Runable介面。
1.進程和線程的區別是什嗎?
進程是執行著的應用程式,而線程是進程內部的一個執行序列。一個進程可以有多個線程。線程又叫做輕量級進程。
2.建立線程有幾種不同的方式?你喜歡哪一種?為什嗎?
有三種方式可以用來建立線程:
(1)繼承Thread類
(2)實現Runnable介面
(3)應用程式可以使用Executor架構來建立線程池
實現Runnable介面這種方式更受歡迎,因為這不需要繼承Thread類。在應用設計中已經繼承了別的對象的情況下,這需要多繼承(而Java不支援多繼承),只能實現介面。同時,線程池也是非常高效的,很容易實現和使用。
3.概括的解釋下線程的幾種可用狀態。
線程在執行過程中,可以處於下面幾種狀態:
就緒(Runnable):線程準備運行,不一定立馬就能開始執行。
運行中(Running):進程正在執行線程的代碼。
等待中(Waiting):線程處於阻塞的狀態,等待外部的處理結束。
睡眠中(Sleeping):線程被強制睡眠。
I/O阻塞(Blocked on I/O):等待I/O操作完成。
同步阻塞(Blocked on Synchronization):等待擷取鎖。
死亡(Dead):線程完成了執行。
4.同步方法和同步代碼塊的區別是什嗎?
在Java語言中,每一個對象有一把鎖。線程可以使用synchronized關鍵字來擷取對象上的鎖。synchronized關鍵字可應用在方法層級(廣泛鎖定)或者是代碼塊層級(細部鎖定)。
5.在監視器(Monitor)內部,是如何做線程同步的?程式應該做哪種層級的同步?
監視器和鎖在Java虛擬機器中是一塊使用的。監視器監視一塊同步代碼塊,確保一次只有一個線程執行同步代碼塊。每一個監視器都和一個對象引用相關聯。線程在擷取鎖之前不允許執行同步代碼。
6.什麼是死結(deadlock)?
兩個進程都在等待對方執行完畢才能繼續往下執行的時候就發生了死結。結果就是兩個進程都陷入了無限的等待中。
7.如何確保N個線程可以訪問N個資源同時又不導致死結?
使用多線程的時候,一種非常簡單的避免死結的方式就是:指定擷取鎖的順序,並強制線程按照指定的順序擷取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會出現死結了。