線程中有幾個方法須要咱們區分多線程
1 sleep方法是表示線程執行到這的時候只是暫時處於「睡眠」狀態,在這種狀態下線程是不會釋放CPU資源的,當到達休眠時間後,線程繼續「起來」幹活。當線程處於sleep狀態時別的線程不能夠訪問被鎖定的對象。測試
2 yield方法指的是該線程暫時釋放出CPU資源把CPU資源讓給其餘線程,它重回就緒狀態等待CPU分配給相應的CPU時間片給它而後再執行。線程
3 wait方法指線程進入等待狀態,此時別的線程能夠訪問被鎖定的對象,當線程處於wait狀態時,只有調用notify方法才能將線程「喚醒」讓該線程從新進入就緒狀態。設計
線程的同步通常有兩種一種是同步代碼塊,同步代碼塊後面有個括號,裏面能夠選擇是同步對象仍是同步類字節碼。當你同步的方法中有static修飾的時候那麼鎖的是字節碼。同步普通方法的話是當前對象,同步靜態方法的話是同步的類字節碼。靜態變量是這個類初始化的時候,靜態變量已經幫你初始化好,而且放到靜態區了,你實例化出來的對象的靜態變量都指向靜態區中的那個靜態變量的地址值。對象
因此當咱們使用線程同步時,要明確鎖的資源,究竟是鎖字節碼仍是鎖對象。若是同時鎖一個資源那就是互斥了。繼承
線程只能start一次,再次啓動時會報異常 IllegalThreadStateException。接口
JVM就是多線程的,主方法是個線程,垃圾回收也是個線程。資源
啓動多線程的話有有三種方法同步
1 設計一個Thread子類並重寫其run方法,實例化這個子類,而且使用這個類的start方法。it
2 設計一個測試類實現runable接口,並在這個類中重寫run方法,實例化一個線程把測試類看成構造參數,來構造一個新的Thread類。
3 使用匿名類,繼承Thread,重寫run方法,直接在run方法中寫業務代碼。匿名類的一個好處是能夠很方便的訪問外部的局部變量。前提是外部的局部變量須要被聲明爲final。(JDK7之後就不須要了)