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學習型技術博客、期待與您交流! ------------