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