---------------------- android培訓 、java培訓 、期待與您交流! ----------------------
線程
進程:是一個執行中的程序,每一個進程執行都有一個執行順序,該順序是一個執行路徑,或者叫一個控制單元
線程:就是進程中一個獨立的控制單元,線程控制這進程的執行。
一個進程中至少有一個線程
jvm 啓動的時候就有一個java.exe進程,該進程中至少有一個線程在執行,存在與main方法中 我們稱之爲主線程
如何自定義一個線程:
第一中方式
1 定義一個類繼承 Thread類,就表示這是一個線程類
2 重寫run方法
3 調用線程的statr方法,該方法啓動線程,執行run方法。run方法中存儲線程要執行的代碼
currentThread():獲取當前線程對象
getName():獲取線程名次
設置線程名稱:setName 或構造函數
創建線程的第二種方式:實現Runnable接口
1:定義類實現Runnable接口
2 重寫Runnable接口的run方法,將要運行的代碼存放在run方法中
3 通過Thread類創建線程
4 講創建的的類作爲參數傳遞給Thread的構造函數
5 調用Thread類的start方法開啓線程
實現方式和繼承方式有什麼區別:
實現方式避免了繼承方式單繼承的侷限性。定義線程是建議使用實現方式。
繼承方式 線程代碼存放在Thread子類的run方法中,實現方式線程運行代碼放在Runnable接口子類的run方法中
多線程安全問題:當多條操作記錄共享數據時,一個線程只執行了一部分還沒有執行完,這時另一個線程進來執行,導致共享數據錯誤
java對多線程問題提供了專業的解決方式,就是同步代碼塊。
synchronized(對象){//這裏的對象就是鎖
需要做同步處理的代碼
}
或者 synchronized作爲修飾符修飾一個方法(非靜態同步函數的鎖就是this,靜態同步函數使用的鎖是所在的類:類名.class)
同步的前提:
1 至少有2個或2個以上線程
2 多個線程使用同一個鎖
同步處理好處:解決了多線程安全問題
弊端 :每次要判斷鎖,比較消耗資源
如何判斷那些代碼需要同步。
1 明確那些代碼是多線程運行代碼
2 明確共享數據
3 明確多線程運行代碼中那些語句是操作共享數據
死鎖:
通常造成死鎖的原因: 同步中嵌套同步,而各自實用的鎖不同
死鎖也可能能正常運行。
下面是一個死鎖:
//定義一個類實現Runnable接口
public class ThreadOne implements Runnable {
private int tick = 100;
boolean flag = true;
Object obj = new Object();
//重寫run方法,把要執行的線程代碼寫在run方法中
public void run() {
if (flag) {
while (true) {
//同步代碼塊,需要傳入一個對象作爲鎖
synchronized (obj) {//obj鎖 裏面有this鎖
show();
}
}
}
else {
while (true) {
show();
}
}
}
//在函數上加synchronized做同步處理 不需要傳參數 他的鎖就是this
private synchronized void show() {//this鎖裏面有obj鎖
synchronized (obj) {
if (tick > 0) {
try {
Thread.sleep(10);
System.out.println(Thread.currentThread().getName() + "---code:"
+ tick--);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public class ThreadTest {
public static void main(String[] args) {
//創建接口對象
ThreadOne to = new ThreadOne();
//創建一個線程,把對象傳入創建的線程,線程就會執行對象中的run方法
Thread t1 = new Thread(to);
Thread t2 = new Thread(to);
//啓動一個線程
t1.start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
to.flag=false;
t2.start();
}
}
---------------------- android培訓 、java培訓 、期待與您交流! ----------------------