執行緒的狀態
new:初始狀態,執行緒被new 出來,但還沒start()的狀態
runnable:指的是呼叫了start()方法,但還在等著cpu資源的狀態;
running:乙個執行緒獲得了cpu資源,正在走的狀態;
terminated:執行緒物件的run()方法走完了的狀態
blocked:執行緒被阻塞,即該執行緒把cpu資源讓出來,等待其他操作再回來請求cpu的狀態、
2.執行緒通訊:
volatile:volatile修飾的變數每次訪問的時候都保證是記憶體中的最新版本,可以理解為「任何乙個執行緒修改了volatile變數,均能使其他執行緒感知到」。
synchronized:修飾**塊和方法,可以保證是執行緒同步的。即只能有乙個執行緒進入**塊。
wait/notify:
wait()只能在同步塊或方法裡面呼叫,呼叫wait方法後,該執行緒阻塞,直到其他執行緒呼叫這個物件的notify()方法,那麼該執行緒就回到佇列裡等待cpu資源。
此處有兩個注意的地方:(1)wait()方法需要對呼叫物件加鎖。(2)wait是釋放鎖的,但其他執行緒notify他了之後,這個wait的執行緒也不會繼續進行,必須等到notify他的執行緒離開同步塊,才能回到佇列裡等待cpu排程。(3)從wait方法返回的前提是獲得了呼叫物件的鎖。
用偽**描述生產者-消費者經典模型:
生產者:
synchronized(object o)
消費者:
synchronized(object o)
dosth();
}
3.thread.join()
如果乙個執行緒a呼叫了b.join();,那麼a就阻塞,直到b執行緒的run()執行完,a再繼續執行。
寫了個小例子,將就看一下啦:
public
class
main catch (interruptedexception e)
system.out.println("main");
}}public
class
mythread
implements
runnable
@override
public
void
run() catch (interruptedexception e)
system.out.println(tid);
}}
那麼執行這段程式,會看到先輸出了
t1,t2要來啦!!
然後等了1秒之後,輸出了
1
2main
4.threadlocal
這東西是乙個封裝類,把乙個物件封裝成執行緒獨享的,底層維護的是乙個hashmap,其key是執行緒的hashcode,value是這個物件的副本。
get和set原始碼如下,其實和hashmap基本上如出一轍。
public t get()
}return setinitialvalue();
}
public
void
set(t value)
Java高併發程式設計學習筆記1
執行緒的runnable狀態 已經具備執行條件,只等待cpu排程 萬事俱備只欠東風 1 thread類中得start方法啟動乙個執行緒,並且該執行緒進入了可執行態 runnabel 2 run方法和start方法的區別。3 線 正的執行邏輯在run方法中,通常我們把run方法稱為執行緒的執行單元。重...
JAVA併發1 併發程式設計的挑戰
乙個cpu同一時刻只能執行乙個執行緒 cpu 通過給每個執行緒分配一定的時間片,時間片非常短,通常是幾十毫秒,來不停的切換執行緒執行任務,達到了多執行緒的效果。當執行緒用完自己的時間片後,及時任務還沒有完成,作業系統也會剝奪它的執行權,讓另一條執行緒執行。當一條執行緒的時間片用完後,作業系統會暫停該...
java併發程式設計 並行和併發(1)
1.為什麼需要並行?效能 在多核cpu提高效能業務需求 平行計算還出於業務模型的需要 並不是為了提高系統效能,而是確實在業務上需要多個執行單元。比如http伺服器,為每乙個socket連線新建乙個處理執行緒 讓不同執行緒承擔不同的業務工作 簡化任務排程 2.概念 同步 synchronous 和非同...