第39期Java面試題:實現Java線程方法,sleep() 和 wait() 區別

1、一個幾千萬數據,發現數據查詢很慢,怎麼辦?

1、查看對應的查詢字段上是否建立索引,如果沒有建立索引的話,建立索引,再查看效果。

2、如果已經建立了索引的話,分析對應的sql語句是否存在問題,是否有走索引。

3、如果sql語句沒有問題,也走了索引的話,則考慮因為表的頻繁的增刪操作,導致表空間持續增大未得到釋放,此時需要釋放表空間,重建索引。

2、java中有幾種方法可以實現一個線程?用什麼關鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?

實現線程有兩種方式:1.繼承Thread類,重寫run方法,在調用start方法。

實現Runnable接口,重寫run方法。在傳給Thread構造器,調用時調用Thread的start方法。

用synchronized關鍵字修飾同步方法 。

不使用stop(),是因為它不安全。它會解除由線程獲取的所有鎖定,而且如果對象處於一種不連貫狀態,那麼其他線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,指出線程應該活動還是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()重新啟動線程。

3、sleep() 和 wait() 有什麼區別?

sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。 wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。

第39期Java面試題:實現Java線程方法,sleep() 和 wait() 區別


分享到:


相關文章: