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