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