線程的5種狀態:新建,就緒,運行,阻塞,死亡。
Thread.sleep:線程 運行狀態 轉為 阻塞狀態。
Thread.yield: 線程 運行狀態 轉為 就緒狀態。
ThreadA.join:等待ThreadA執行完成。
線程的兩種方式:
繼承自Thread,實現Runnable.
在線程中看是否有操作的同一對象的實例。如果有的話要考慮線程的同步和互斥。通俗點來說就是某個類的某個成員變量會有多個線程訪問。
線程的同步:
同步代碼塊:同步加鎖的是對象,而不是代碼。
synchronized(Object A){
}
同步監視器是A,表示的是一個臨界區。
同步方法:
synchronized Method1(){
}
synchronized Method2(){
}
同步鎖:
Lock lock = new ReentrantLock();
public Mehtod1(){
lock.lock();
finally{
lock.unlock();
}
}
public Mehtod2(){
lock.lock();
finally{
lock.unlock();
}
}
同步監視器的釋放:
1.當前線程的同步方法或者同步代碼塊執行結束,當前線程即釋放同步監視器。
2.在同步方法或者同步代碼塊中出現了error或者exception的時候。
3.當線程執行同步方法或者同步代碼塊時,程序執行了同步監視器對象的wait方法,則當前線程,並釋放同步監視器。
下面的情況不會釋放同步監視器:
1.當線程執行同步方法或者同步代碼塊時,程序調用Thread.Sleep,Thread.Yield方法。
2.當線程執行同步方法或者同步代碼塊時,其他線程調用了該線程的suspend方法將該線程掛起。
線程的通信:
同步方法塊或者同步方法使用object的wait,notify和notifyAll三個方法來進行線程的通信。
如果是同步方法塊synchronized(Object a):則在代碼中要使用a.wait,a.notify,a.notifyAll;
如果使用的是同步方法synchronized methodA(),則同步監視器是this對象,可以直接在代碼中使用wait,notify和notifyAll方法。
wait:導致當前的線程等待,並且釋放當前的同步監視器。直到其他線程調用該同步監視器的notify方法和notifyall方法。
notify:喚醒在此監視器上等待的單個線程,但是選擇是任意的。
notifyAll:喚醒在同步監視器上等待的所有線程。