多線程的面試題解答(一)

今天看到這篇文章

http://ifeve.com/javaconcurrency-interview-questions-base/


嘗試解答一下里面的問題,陸續更新。


1

Java中有幾種方法可以實現一個線程

1.實現runnable
2.實現callable
3.繼承thread

1、繼承Thread類實現多線程
2、實現Runnable接口方式實現多線程
3、使用ExecutorService、Callable、Future實現有返回結果的多線程

ExecutorService提供了submit()方法,傳遞一個Callable,或Runnable,返回Future。如果Executor後臺線程池還沒有完成Callable的計算,這調用返回Future對象的get()方法,會阻塞直到計算完成。

2
1. stop,不推薦使用
2. interrupt但是不能停止一個循環
3. 拋出中斷異常,最好拋出一個RuntimeException

3
sleep和wait的區別

第一種解釋:功能差不多,都是讓線程休眠,但是sleep()不釋放同步鎖,wait()釋放同步鎖。
第二種解釋:sleep是Thread類的靜態方法。sleep的作用是讓線程休眠指定的時間,在時間到達時恢復,也就是說sleep將在接到時間到達事件事恢復線程執行。
wait是Object的方法,也就是說可以對任意一個對象調用wait方法,調用wait方法將會將調用者的線程掛起,直到其他線程調用同一個對象的notify/notifyAll方法纔會重新激活調用者。
第三種解釋:sleep()是讓某個線程暫停運行一段時間,其控制範圍是由當前線程決定。
wait()由某個確定的對象來調用。

4
notify和notifyAll的區別
wait()方法表示,放棄當前對資源的佔有權,等啊等啊,一直等到有人通知我,我纔會運行後面的代碼。 
notify()方法表示,當前的線程已經放棄對資源的佔有, 
通知等待的線程來獲得對資源的佔有權,但是隻有一個線程能夠從wait狀態中恢復, 
然後繼續運行wait()後面的語句; 
notifyAll()方法表示,當前的線程已經放棄對資源的佔有, 
通知所有的等待線程從wait()方法後的語句開始運行。 

5
什麼是Daemon線程?它有什麼意義

守護線程,意義,非守護線程停止時,不必關閉守護線程,GC線程就是一個守護線程



6
多線程之間的通訊和協作
1.內存共享
   通過實現Runnable接口實現線程的共享變量
   可以通過內部類的形式來共享變量
2.管道鏈接
   PipedOutputStream
   PipedInputStream
3.wait和notify/notifyAll
4.await和signal/signalAll
5.sleep/yield/join
6.cyclicbarrier
7.countdownlatch
8.semaphore

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章