黑馬程序員——Java線程

---------------------- android培訓java培訓、期待與您交流! ----------------------

 

d.start( )方法 開啓線程並執行該線程的run方法。

 

1.定義類實現Runnable接口

2)覆蓋run()將線程要運行的代碼存放在該run方法中

3)通過Thread類簡歷線程對象

4)通過Runnable接口的子類作爲實際參數傳遞給Thread類的構造函數

5)調用Thread類的static方法開啓線程並調用Runnable接口類的run方法

 

實現方式和繼承方式的區別

實現方式的好處:避免了單繼承的侷限性。

在定義線程時,建議使用實現方式。

 

兩種方式區別

繼承Thread 線程代碼存放Thread子類的run方法中。

實現Runnable 線程代碼存在接口的子類的run方法中。

 

同步函數是用哪一個鎖?

函數需要被對象調用,那麼函數都有一個所屬對象引用,就是this

所以同步函數使用的鎖是this

 

靜態的同步方法使用的鎖是該方法所在類的字節碼對象 類名.class

 

單例設計模式:

餓漢式

class Single{

private  static final Single s = new Single();

private  Single(){ }

public static Single getInstance(){

return s;

}

}

 

 

懶漢式

class Single{

private static Single s = null

private Single(){ }

public static Single getInstance(){

if(s==null)

s = new Single();

return s;

}

}

遇到多線程時,採用同步優化的結果

class Single{

private static Single s = null

private Single(){ }

public static Single getInstance(){

if(s==null)

{synchronized(Single.class)

if(s==null)

s = new Single();

}

return s;

}

}

 

wait;

notify

notifyAll

都使用在同步中,因爲要對持有監視器(鎖)的線程操作

所以要使用在同步中,因爲值得用同步才具有鎖

爲什麼這些操作線程的方法要定義Object類中呢

因爲這些方法在操作同步的線程時,都必須要標示他們所操作線程持有的鎖。

只有同一個鎖上的被等待線程,可以被同一個鎖上notify喚醒。

不可以對不同鎖中的線程進行喚醒。

也就是說,等待和喚醒必須是同一個鎖。

而鎖是任意對象,所以可以被任意對象調用的方法定義在Object類中

 

死鎖代碼用來更好理解同步

//自己創建一個死鎖過程
package testing;

class Test3 implements Runnable{
 private boolean flag=true;
 Test3(boolean flag){
  this.flag = flag;
 }
 public void run(){
  if(flag){
   //A鎖裏有B鎖
  synchronized(Lock.Locka){
   System.out.println("if Locka");
   synchronized(Lock.Lockb){
    System.out.println("if Lockb");
   }
   
  }
  }
  else{
   //A鎖裏有B鎖
   synchronized(Lock.Lockb){
    System.out.println("else Lockb");
    synchronized(Lock.Locka){
     System.out.println("else Locka");
     
    }
    
   }
   }
  }
 }

class Lock{
  static Object Locka = new Object();
  static Object Lockb = new Object();
}
public class DeadLock {
 public static void main(String[] args){
 //boolean flag = true;
 Thread t1 = new Thread(new Test3(true));
 Thread t2 = new Thread(new Test3(false));
 t1.start();
 t2.start();
 }
 

}

 

---------------------- android培訓java培訓、期待與您交流! ----------------------詳細請查看:http://edu.csdn.net/heima
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章