Java線程java
Java
windows
1.進程安全
進程:就是正在運行的程序,分配內存讓應用程序可以運行。多線程
Windows系統號稱多任務(能夠他同時運行多個應用程序).jvm
宏觀上看:windows確實是容許了多個程序。函數
微觀上看:cpu快速切換執行任務,因爲速度特別快,咱們人感受不到這個切換的過程。學習
2.線程:線程在一個進程中負責代碼的執行,就是一個進程中的執行路徑。this
疑問:沒有學習線程,爲何代碼能夠執行?spa
答:java程序在運行的時候,jvm會幫咱們建立一個主線程來執行代碼。主線程主要負責main方法中的代碼執行。線程
一個java程序中至少有2個線程:
一個是主線程只要負責main方法中的代碼執行,一個垃圾回收器線程,負責垃圾回收。
3.多線程:在一個進程中多個線程同時執行不一樣的任務。"同時":單核cpu快速切換多個線程執行任務,速度特別快感受不到切換。
多線程的好處:
1.解決一個進程中同時執行多個任務的問題。
2.提升資源的利用率。、
多線程的弊端:
1.增長cpu的負擔。不是線程越多越好。
2.下降了一個進程中線程的執行。
3.容易引起線程安全問題。
4.出現死鎖現象。
//java中建立線程有兩種方式:
方式一:Thread(線程類)
1.須要定義一個類來繼承Thread類
2.重寫thread類中run方法,把自定義線程的任務代碼寫在run方法中.
每個線程都有本身的任務代碼.jvm建立的主線程的任務代碼就是main方法,自定義的線程的任務代碼就寫在run方法中,自定義的線程就須要來執行run方法中的代碼,
3.建立Thread的子類,而且調用start()方法開啓線程
注意點:一旦線程開啓了,會默認執行線程對象中的run方法,可是千萬不要本身直接調用run方法,若是直接調用了run方法就和普通方法沒有區別
java給線程加鎖:
方式一:同步代碼塊
//鎖對象能夠是任意一個java中的對象
//java中的任意一個對象都會有一個對象的狀態,就能夠經過對象的狀態來做爲鎖的一個標識符.
//statue = 0 表示鎖是關閉 statue = 1 表示鎖打開
synchronized(鎖對象){}
同步代碼塊的使用注意點:
1.任意一個對象均可以作鎖對象
2.若是你在同步代碼塊中調用了sleep方法,不會釋放鎖對象。
3.只有真正的存在線程安全的時候才須要使用同步代碼塊,不然會下降執行效率。
4.多線程操做鎖對象必須是惟一的,不然無效。
不知道何時安全,何時不安全?
答:出現線程安全的問題根本緣由:
1.存在兩個或兩個以上的線程.而且線程之間共享着一個資源.
2.多個語句操做了共享資源
方式二:同步函數:
用關鍵字synchronized 修飾函數
同步函數是否有鎖對象:有的.
同步函數使用注意點:
1.若是是一個非靜態的函數,同步函數的鎖對象就是調用方法的對象(this對象),若是是一個靜態函數同步函數的鎖對象是當前函數所屬類的字節碼文件(class對象).
2.同步函數的鎖對象固定,不可以本身來指定.
3.同步函數是同步整個函數的代碼.
推薦你們使用:同步代碼塊.
緣由:
1.同步代碼塊的鎖對象能夠由我任意指定,同步函數是固定的.
2.同步代碼塊能夠控制被同步的範圍,同步函數必須是整個函數的全部代碼都被同步.
代碼同步是能夠解決線程安全問題,可是若是使用不當會致使線程死鎖問題:
A線程等B線程完成,B線程又在等A線程,結果兩我的就一直等下去,這個時候形成了線程死鎖.
線程死鎖不必定會出現,有可能會出現.
死鎖對象的解決方案:沒有方案,儘可能避免發生.
線程的定義方式二:
1.自定義一個類實現Runable接口,接口中就會提供一個run方法
2.實現Runable接口中的run方法.將線程中的任務寫在run方法中
3.建立Runable接口的實現類對象.
4.建立一個Thread對象,並把Runable實現類建立的對象做爲參數.
5.調用Thread對象的start方法來開啓線程
問題:爲何Runable接口實現類的實現類的對象做爲參數傳遞?
爲了讓對象中的run方法可以在線程中的run方法中執行,也就是可以將對象中的run方法最爲線程中的任務來執行.
推薦使用:第二種方式 實現Runable.
4.線程的通信:一個線程完成本身的任務,去通知另一個線程去完成另一個任務.
wait();等待 若是線程執行了wait方法,那麼該線程就會處於一個等待狀態,等待狀態的線程必需要經過其餘線程來調用notify方法來喚醒。
notify();喚醒 隨機喚醒線程池。
notifyAll();喚醒全部等待的線程。
生產者和消費者.
wait和notify的使用注意點 :
1.wait方法和notify方法是屬性Object對象
2.wait方法和notify方法必須在同步線程中執行
3.wait方法和notify方法必須有鎖對象來調用