標籤:
1. java中有幾種方法可以實現一個線程?
多線程有兩種實現方法,分別是繼承Thread類與實現Runnable介面。
這兩種方法的區別是,如果你的類已經繼承了其它的類,那麼你只能選擇實現Runnable介面了,因為Java只允許單繼承的。
2. 如何停止一個正在啟動並執行線程?
(1)方法1: 調用Thread.stop()方法停止線程。
Thread.stop()不安全,已不再建議使用。
該方法天生是不安全的。使用thread.stop()停止一個線程,導致釋放(解鎖)所有該線程已經鎖定的監視器(因沿堆棧向上傳播的未檢查異常ThreadDeath而解鎖)。如果之前受這些監視器保護的任何對象處於不一致狀態,則不一致狀態的對象(受損對象)將對其他線程可見,這可能導致任意的行為。
(2)方法2: Thread.interrupt()
- 傳遞InterruptedException。這是最明智的策略,將異常傳遞給方法的調用者。
- 恢複中斷。在不能上拋的情況下,如Runnable方法,必須捕獲InterruptedException,並通過當前線程的interrupt()方法恢複中斷狀態,這樣在調用棧中更高層的代碼將看到引發了一個中斷。
(3)方法3:停止一個線程最佳實務是 中斷 + 條件變數。
中斷只是一種協作機制,需要被中斷的線程自己處理中斷。
停止一個線程最好的做法就是利用共用的條件變數。
3. notify()和notifyAll()有什麼區別?
void notify(): 喚醒一個正在等待該對象的線程。
void notifyAll(): 喚醒所有正在等待該對象的線程。
4. sleep()和 wait()有什麼區別?
sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時後會自動回復。調用sleep不會釋放對象鎖。
wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
5. 什麼是Daemon線程?它有什麼意義?
所謂後台(daemon)線程,是指在程式啟動並執行時候在後台提供一種泛型服務的線程,並且這個線程並不屬於程式中不可或缺的部分。因此,當所有的非後台線程介紹時,程式也就終止了,同時會殺死進程中的所有後台線程。反過來說,只要有任何非後台線程還在運行,程式就不會終止。必須線上程啟動之前調用setDaemon()方法,才能把它設定為後台線程。注意:後台進程在不執行finally子句的情況下就會終止其run()方法。
6. java如何?多線程之間的通訊和協作?
Java提供了3個非常重要的方法來巧妙地解決線程間的通訊問題。這3個方法分別是:wait()、notify()和notifyAll()。它們都是Object類的最終方法,因此每一個類都預設擁有它們。雖然所有的類都預設擁有這3個方法,但是只有在synchronized關鍵字作用的範圍內,並且是同一個同步問題中搭配使用這3個方法時才有實際的意義。這些方法在Object類中聲明的文法格式如下所示:
final void wait() throws InterruptedExceptionfinal void notify()final void notifyAll()
Java面試題-多線程