黑馬程序員-多線程創建、同步

----------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------
stop方法已經過時。

如何停止線程?
只有一種,run方法結束。
開啓多線程運行,運行代碼通常是循環結構。

只要控制住循環,就可以讓run方法結束,也就是線程結束。

特殊情況:
當線程處於了凍結狀態。
就不會讀取到標記。那麼線程就不會結束。

當沒有指定的方式讓凍結的線程恢復到運行狀態是,這時需要對凍結進行清除。
強制讓線程恢復到運行狀態中來。這樣就可以操作標記讓線程結束。

Thread類提供該方法 interrupt();

進程:正在執行的程序。

線程:是進程中用於控制程序執行的控制單元(執行路徑,執行情景)

進程中至少有一個線程。

對於JVM,啓動時,只好有兩個線程:jvm的主線程。jvm的垃圾回收線程。

如何在程序中自定義線程呢?
Java給我們提供了對象線程這類事物的描述。該類是Thread


該類中定義了,
創建線程對象的方法(構造函數).
提供了要被線程執行的代碼存儲的位置(run())

還定義了開啓線程運行的方法(start()).
同時還有一些其他的方法用於操作線程:
static Thread currentThead():
String getName():
static void sleep(time)throws InterruptedException:

要運行的代碼都是後期定義的。
所以創建線程的第一種方式是:繼承Thread類。原因:要覆蓋run方法,定義線程要運行的代碼。

步驟:
1,繼承Thread類。
2,覆蓋run方法。將線程要運行的代碼定義其中。
3,創建Thread類的子類對象,其實就是在創建線程,調用start方法。

如果自定義的類中有多線程要運行的代碼。但是該類有自己的父類。
那麼就不可以在繼承Thread。怎麼辦呢?

Java給我們提供了一個規則。Runnable接口。
如果自定義類不繼承Thread,也可以實現Runnable接口。並將多線程要運行的代碼存放在Runnable的run方法中。
這樣多線程也可以幫助該類運行。
這樣的操作有一個好處:避免了單繼承的侷限性。

創建線程的第二種方式:實現Runnable接口。

步驟:
1,定義了實現Runnable接口。
2,覆蓋接口的run方法。將多線程要運行的代碼存入其中。
3,創建Thread類的對象(創建線程),並將Runnable接口的子類對象作爲參數傳遞給Thread的構造函數。
爲什麼要傳遞?因爲線程要運行的代碼都在Runnable子類的run方法中存儲。所以要將該run方法所屬的對象
傳遞給Thread。讓Thread線程去使用該對象調用其run方法。
4,調用Thread對象的start方法。開啓線程。

兩種方式的特點:
實現方式,因爲避免了單繼承的侷限性,所以創建線程建議使用第二種方式。
#第一重點:創建線程的兩種方式#

作爲了解:
線程的狀態。
1,被創建。
2,運行。
3,凍結。
4,消亡。
其實還有一種特殊的狀態:臨時狀態。
該臨時狀態的特點:
具備了執行資格,但不具備執行權。
凍結狀態的特點:
放棄了執行資格。

多線程具備隨機性。因爲是由cpu不斷的快速切換造成的。
就有可能會產生多線程的安全問題。
問題的產生的原因:
幾個關鍵點:
1,多線程代碼中有操作共享數據。
2,多條語句操作該共享數據

當具備兩個關鍵點時,
有一個線程對多條操作共享數據的代碼執行的一部分。還沒有執行完,另一個線程開始參與執行。
就會發生數據錯誤。
解決方法:
當一個線程在執行多條操作共享數據代碼時,其他線程即使獲取了執行權,也不可以參與操作。
Java就對這種解決方式提供了專業的代碼。
同步
同步的原理:就是將部分操作功能數據的代碼進行加鎖。

示例:火車上的衛生間。

同步的表現形式:
1,同步代碼塊。
2,同步函數。
兩者有什麼不同:
同步代碼塊使用的鎖是任意對象。
同步函數使用的鎖是this。

注意:對於static的同步函數,使用的鎖不是this。是 類名.class 是該類的字節碼文件對象。
涉及到了單例設計模式的懶漢式。
同步的好處:解決了線程的安全問題。


弊端:
較爲消耗資源。
同步嵌套後,容易死鎖。

要記住:同步使用的前提:
1,必須是兩個或者兩個以上的線程。
2,必須是多個線程使用同一個鎖。
這是纔可以稱爲這些線程被同步了。

死鎖代碼一定會寫。但開發時一定注意避免。
#第二重點:同步的所有特性    #
/*


class Thread 
{
private Runnable target;


Thread()
{
}
Thread(Runnable target)
{
this.target = target;
}


public void run()
{
if(target!=null)
target.run();
}
}


class Test implements Runnable
{
public void run()
{}
}




main()
{
Test q = new Test();
Thread t = new Thread(q);
}




class Demo extends Thread
{
public void run()
{
}
}
class  
{
public static void main(String[] args) 
{
System.out.println("Hello World!");
}
}
*/

----------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------

發佈了27 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章