java學習之執行緒2

2021-08-20 12:22:53 字數 3158 閱讀 1285

賣演唱會票例子

保證:多個執行緒訪問共享的資料(資料只有乙份)

public static void main(string args) 

//介面實現執行緒的方式

class ticketrunnable implements runnable catch (interruptedexception e)

//賣system.out.println(thread.currentthread().getname()+"*****"+ticket);

//賣一張 少一張

ticket--;

}else

}//讓出cpu的執行資源(隨機讓出)

thread.yield();

} }}

同步**塊規則:

當執行緒進入同步**塊的時候

先看一下有沒有鎖

如果有鎖 就進入同步**塊中執行**

進去的同時會獲取這把鎖

當**執行完畢 出同步**塊時 將這把鎖釋放(還回去)

如果沒鎖 執行緒在同步**塊前等待(等著有鎖才能進)

同步**塊(同步鎖)

鎖:任意物件(只有一把鎖 使用的是同一把鎖)

synchronized(鎖)

同步鎖好處:資料安全

壞處:效率會降低(獲取鎖和釋放鎖 會耗費資源)

同步方法(作用和同步**塊相同)

也是用synchronized關鍵字

該關鍵字宣告在方法上

同一時間 只能有乙個執行緒進入到同步方法中執行**

同步方法中 也是寫操作共享資料的**

處理方式和同步**塊一樣

public synchronized void sellticket()

jdk1.5 lock 介面

使用實現類 reentrantlock

lock();獲取鎖

unlock();釋放鎖(保證鎖一定會被釋放)

使用前提:和同步**塊一樣 要保證用的是同一把鎖

使用格式:

tryfinally

while (true)  finally 

}

執行緒死鎖

前提:必須要有同步鎖的巢狀

2.鎖物件要唯一(使用的是同一把鎖)

兩把鎖都要保證唯一

synchronized()

}

public static void main(string args) 

//建立a鎖

class locka

//定義乙個常量

public static final locka lock_a=new locka();

}//建立b鎖

class lockb

//定義乙個常量

public static final lockb lock_b=new lockb();

}class dielockrunnable implements runnable

}}else }}

//修改標記

isflag=!isflag;

} }}

執行緒如何停止?

interrupt()方法 中斷執行緒

1.呼叫interrupt方法是 執行緒中有wait()/sleep()等方法 這時會丟擲乙個異常

interruptexception異常 並且清除中斷狀態

2.呼叫interrupt方法時 執行緒中沒有上述方法

這時會設定(改變)中斷狀態的值(true---false)

public static void main(string args)  catch (interruptedexception e) 

//中斷執行緒

t1.interrupt();

//標記中斷執行緒

runnable.isflag=true;

system.out.println("中斷執行緒");

try catch (interruptedexception e)

system.out.println("主線程結束");

}class interruptrunnable implements runnable catch (interruptedexception e)

//休眠一秒(迴圈卡1秒)

//long time = system.currenttimemillis();

//while (system.currenttimemillis()-time<1000)

system.out.println(thread.currentthread().getname()+"...run");

} }}

呼叫interrupt方法時

執行緒中有wait()方法

wait()方法 執行緒等待並且如果沒有被喚醒 就一直等待下去

是object類中的方法

直接使用wait()方法會出現異常

注意:wait()方法必須使用鎖物件去呼叫

public static void main(string args) 

system.out.println(i);

} system.out.println("主線程結束");

}class waitrunnable implements runnable catch (interruptedexception e)

system.out.println(thread.currentthread().getname()+"...run");

} }}

從子執行緒中更改中斷執行緒的標記

讓主線程能夠接到這個標記改變

public static void main(string args) 

system.out.println("主線程結束");

}class volrunnable implements runnable catch (interruptedexception e)

if (num>5)

system.out.println(thread.currentthread().getname()+"...run");

} }}

java學習筆記之多執行緒(2)之執行緒安全

1 同步 塊 synchronized obj 鎖的必須是各執行緒共享的物件 2 同步方法 synchronized 方法,對自己加鎖 synchronized this 3 同步鎖 只介紹可重入鎖 final reentrantlock lock new reentrantlock 加鎖 呼叫lo...

Java學習之執行緒總結

一 建立執行緒 重點 1 繼承thread 2 實現runnable介面 3 實現callable 了解 二 執行緒的狀態 1 新生 start 就緒 執行 阻塞 終止 2.終止執行緒 重點 3.阻塞 join yield sleep 三 執行緒的資訊 1.thread.currentthread ...

學習日記 java之執行緒

建立執行緒的兩種方法 1 繼承thread類 2 實現runnable介面 解決了單繼承的問題 獲取執行緒的名稱 1 原來執行緒是有預設的名稱的 thread 編號,編號從零開始 2 用getname 可以獲取執行緒名稱。static thread currentthread 獲取當前執行緒物件。直...