2019獨角獸企業重金招聘Python工程師標準>>>
線程中有幾個方法需要我們區分
1 sleep方法是表示線程執行到這的時候只是暫時處于“睡眠”狀態,在這種狀態下線程是不會釋放CPU資源的,當到達休眠時間后,線程繼續“起來”干活。當線程處于sleep狀態時別的線程不可以訪問被鎖定的對象。
2 yield方法指的是該線程暫時釋放出CPU資源把CPU資源讓給其他線程,它重回就緒狀態等待CPU分配給相應的CPU時間片給它然后再執行。
3 wait方法指線程進入等待狀態,此時別的線程可以訪問被鎖定的對象,當線程處于wait狀態時,只有調用notify方法才能將線程“喚醒”讓該線程重新進入就緒狀態。
線程的同步一般有兩種一種是同步代碼塊,同步代碼塊后面有個括號,里面可以選擇是同步對象還是同步類字節碼。當你同步的方法中有static修飾的時候那么鎖的是字節碼。同步普通方法的話是當前對象,同步靜態方法的話是同步的類字節碼。靜態變量是這個類初始化的時候,靜態變量已經幫你初始化好,并且放到靜態區了,你實例化出來的對象的靜態變量都指向靜態區中的那個靜態變量的地址值。
所以當我們使用線程同步時,要明確鎖的資源,到底是鎖字節碼還是鎖對象。如果同時鎖一個資源那就是互斥了。
線程只能start一次,再次啟動時會報異常 IllegalThreadStateException。
JVM就是多線程的,主方法是個線程,垃圾回收也是個線程。
啟動多線程的話有有三種方法
1 設計一個Thread子類并重寫其run方法,實例化這個子類,并且使用這個類的start方法。
2 設計一個測試類實現runable接口,并在這個類中重寫run方法,實例化一個線程把測試類當作構造參數,來構造一個新的Thread類。
3?使用匿名類,繼承Thread,重寫run方法,直接在run方法中寫業務代碼。匿名類的一個好處是可以很方便的訪問外部的局部變量。前提是外部的局部變量需要被聲明為final。(JDK7以后就不需要了)