?? thread.txt~
字號(hào):
1 進(jìn)程:一個(gè)運(yùn)行著的程序; 有獨(dú)立的內(nèi)存空間2 線程:進(jìn)程的一個(gè)執(zhí)行流程; 多個(gè)線程共享相同的內(nèi)存空間 代碼的運(yùn)行最終都體現(xiàn)都是 線程的運(yùn)行 線程 減少內(nèi)存的占用 和 提高運(yùn)行效率(并發(fā)運(yùn)行,所謂并發(fā)并不是同一時(shí)刻 運(yùn)行多個(gè)線程,只是多個(gè)線程之間的切換速度非???,讓人感覺是同時(shí)運(yùn)行而已) 單個(gè)CPU某個(gè)時(shí)刻只能運(yùn)行一個(gè)線程 例如:java Test 1)啟動(dòng)虛擬機(jī)進(jìn)程 2)虛擬機(jī)進(jìn)程 創(chuàng)建 main 線程 3)由 main 線程 執(zhí)行對(duì)應(yīng)類的 main()方法3 線程運(yùn)行時(shí)的特征: 1)使用 start()方法啟動(dòng)線程 2)一個(gè)線程對(duì)象只能啟動(dòng)一次 3)盡量不要重寫 start()方法 4)多個(gè)線程可共享 同一個(gè)對(duì)象 的實(shí)例變量或靜態(tài)變量4 線程編寫: Thread Runnable 1線程類 繼承Thread,重寫run() 實(shí)現(xiàn)Runnable,實(shí)現(xiàn)run() 線程對(duì)象 Mythread t = new Mythread(); Mythread t = new Mythread(); 啟動(dòng)線程 t.start() new Thread(t).start;5 線程狀態(tài): 1)初始狀態(tài):線程類剛實(shí)例化; 2)就緒狀態(tài):線程對(duì)象 執(zhí)行start()方法 (等待CPU權(quán)限) 3)運(yùn)行狀態(tài):拿到CPU 運(yùn)行線程 4)阻塞狀態(tài): a: 調(diào)用sleep()或join(); sleep()仍然持有鎖,僅交出CPU執(zhí)行權(quán) b: 調(diào)用wait(); wait()釋放鎖,交出CPU執(zhí)行權(quán) 進(jìn)入對(duì)象的等待池(等待notify,然后進(jìn)入鎖池) c: 拿到CPU執(zhí)行權(quán),但未拿到鎖,進(jìn)入對(duì)象的鎖池 5)死亡狀態(tài):線程運(yùn)行完run()方法代碼6 并發(fā)訪問問題: 多個(gè)線程訪問 實(shí)例變量或靜態(tài)變量 而引起單個(gè)線程中變量值前后不一致 解決方法:加鎖 synchronized 把多行語句(一般對(duì)實(shí)例變量進(jìn)行操作)作為一個(gè)整體, 即便線程交出CPU執(zhí)行權(quán),其他線程也不能執(zhí)行這些代碼 public void m(){ 語句行1 synchronized(this){ 語句行2 語句行3 } 語句行4 } eg: public synchronized void m(){ 語句行1 語句行2 語句行3 } public synchronized void n(){ 語句行1 語句行2 語句行3 }//此時(shí),鎖的持有者為 this 對(duì)象.假若執(zhí)行m方法的第2句時(shí)被阻塞了,但是m方法并沒有結(jié)束。 鎖的持有者并沒有改變,所以 n方法仍然得不到鎖,所以仍然處于 鎖池 當(dāng)中 public class A{ static int i=10; synchronized static void setI(int j){ i=j; } }//此時(shí),鎖的持有者為 A的類對(duì)象(類加載的時(shí)候)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -