黑馬程序員-線程

---------------------- 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培訓 、期待與您交流! ----------------------

詳細請查看:http://edu.csdn.net/heima

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