1.這兩個方法來自不同的類分別是Thread和Object
- sleep方法沒有釋放鎖中捆,而wait方法釋放了鎖喷面,使得其他線程可以使用同步控制塊或者方法
- wait航闺,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用奋刽,而sleep可以在任何地方使用
- sleep必須捕獲異常滞磺,而wait诫欠,notify和notifyAll不需要捕獲異常
擴(kuò)充閱讀:
Java 線程中的sleep和wait有一個共同作用涵卵,停止當(dāng)前線程任務(wù)運(yùn)行,但他們存在一定的不同荒叼,首先我們先看sleep中的構(gòu)造函數(shù)
sleep(long millis) Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.
sleep(long millis, int nanos) Causes the currently executing thread to sleep (cease execution) for the specified number of milliseconds plus the specified number of nanoseconds, subject to the precision and accuracy of system timers and schedulers.
sleep方法屬于Thread類中方法轿偎,表示讓一個線程進(jìn)入睡眠狀態(tài),等待一定的時間之后被廓,自動醒來進(jìn)入到可運(yùn)行狀態(tài)坏晦,不會馬上進(jìn)入運(yùn)行狀態(tài),因?yàn)榫€程調(diào)度機(jī)制恢復(fù)線程的運(yùn)行也需要時間嫁乘,一個線程對象調(diào)用了sleep方法之后昆婿,并不會釋放他所持有的所有對象鎖,所以也就不會影響其他進(jìn)程對象的運(yùn)行蜓斧。但在sleep的過程中過程中有可能被其他對象調(diào)用它的interrupt(),產(chǎn)生InterruptedException異常仓蛆,如果你的程序不捕獲這個異常,線程就會異常終止法精,進(jìn)入TERMINATED狀態(tài)多律,如果你的程序捕獲了這個異常,那么程序就會繼續(xù)執(zhí)行catch語句塊(可能還有finally語句塊)以及以后的代碼搂蜓。
注意sleep()方法是一個靜態(tài)方法狼荞,也就是說他只對當(dāng)前對象有效,通過t.sleep()讓t對象進(jìn)入sleep帮碰,這樣的做法是錯誤的相味,它只會是使當(dāng)前線程被sleep 而不是t線程
wait方法
void wait(long timeout)
Causes the current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.
void wait(long timeout, int nanos)
Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object, or some other thread interrupts the current thread, or a certain amount of real time has elapsed.
wait屬于Object的成員方法,一旦一個對象調(diào)用了wait方法殉挽,必須要采用notify()和notifyAll()方法喚醒該進(jìn)程;如果線程擁有某個或某些對象的同步鎖丰涉,那么在調(diào)用了wait()后拓巧,這個線程就會釋放它持有的所有同步資源,而不限于這個被調(diào)用了wait()方法的對象一死。wait()方法也同樣會在wait的過程中有可能被其他對象調(diào)用interrupt()方法而產(chǎn)生
2 .進(jìn)程和線程之間有什么不同肛度?
一個進(jìn)程是一個獨(dú)立(self contained)的運(yùn)行環(huán)境,它可以被看作一個程序或者一個應(yīng)用投慈。而線程是在進(jìn)程中執(zhí)行的一個任務(wù)(簡述:CPU的基本執(zhí)行單元)承耿。Java運(yùn)行環(huán)境是一個包含了不同的類和程序的單一進(jìn)程。線程可以被稱為輕量級進(jìn)程伪煤。線程需要較少的資源來創(chuàng)建和駐留在進(jìn)程中加袋,并且可以共享進(jìn)程中的資源。
3 .實(shí)現(xiàn)線程的方式有兩種:
- 繼承java.lang.Thread抱既,并重寫它的run()方法职烧,將線程的執(zhí)行主體放入其中。
- 實(shí)現(xiàn)java.lang.Runnable接口防泵,實(shí)現(xiàn)它的run()方法蚀之,并將線程的執(zhí)行主體放入其中。
4 .10 個線程和 2 個線程的同步代碼择克,哪個更容易寫恬总?
從寫代碼的角度來說,兩者的復(fù)雜度是相同的肚邢,因?yàn)橥酱a與線程數(shù)量是相互獨(dú)立的壹堰。但是同步策略的選擇依賴于線程的數(shù)量,因?yàn)樵蕉嗟木€程意味著更大的競爭骡湖,所以你需要利用同步技術(shù)贱纠,如鎖分離,這要求更復(fù)雜的代碼和專業(yè)知識响蕴。
5 .什么是線程局部變量谆焊?
線程局部變量是局限于線程內(nèi)部的變量,屬于線程自身所有浦夷,不在多個線程間共享辖试。Java 提供 ThreadLocal 類來支持線程局部變量,是一種實(shí)現(xiàn)線程安全的方式劈狐。但是在管理環(huán)境下(如 web 服務(wù)器)使用線程局部變量的時候要特別小心罐孝,在這種情況下,工作線程的生命周期比任何應(yīng)用變量的生命周期都要長肥缔。任何線程局部變量一旦在工作完成后沒有釋放莲兢,Java 應(yīng)用就存在內(nèi)存泄露的風(fēng)險。
詳細(xì)講解:ThreadLocal詳解
6 。什么是不可變對象(immutable object)改艇?Java 中怎么創(chuàng)建一個不可變對象收班?
不可變對象指對象一旦被創(chuàng)建,狀態(tài)就不能再改變谒兄。任何修改都會創(chuàng)建一個新的對象摔桦,如 String、Integer及其它包裝類舵变。不可變(Immutable)和mutable Objects的Java類或?qū)ο?/a>
7 .為什么Thread類的sleep()和yield()方法是靜態(tài)的酣溃?
Thread類的sleep()和yield()方法將在當(dāng)前正在執(zhí)行的線程上運(yùn)行。所以在其他處于等待狀態(tài)的線程上調(diào)用這些方法是沒有意義的纪隙。這就是為什么這些方法是靜態(tài)的。它們可以在當(dāng)前正在執(zhí)行的線程中工作扛或,并避免程序員錯誤的認(rèn)為可以在其他非運(yùn)行線程調(diào)用這些方法绵咱。