Java多執行緒 執行緒通訊使用案例

2021-08-21 03:48:19 字數 4317 閱讀 6362

執行緒通訊

wait():導致當前執行緒等待,直到其他執行緒呼叫該同步監視器的notify()方法和notifyall()方法來喚醒該執行緒

notify():喚醒在此同步監視器上等待的單個執行緒,會選擇喚醒其中的任意乙個執行緒,選擇是任意的。只有當前執行緒放棄對該同步監視器的鎖定後(呼叫wait()方法),才會執行被喚醒的執行緒。

notifyall():喚醒在此同步監視器上等待的所有執行緒。只有放棄對該同步監視器的鎖定後才可以執行被喚醒的執行緒。

採用object中的方法模擬訪問取錢的操作。只有當存錢後才執行取錢操作。

賬戶類:

public class account 

/*** 取錢

* * @param drawamount

*/public synchronized void draw(double drawamount) else

} catch (interruptedexception e)

} /**

* 存錢

* * @param depositamount

*/public synchronized void deposit(double depositamount) else

} catch (interruptedexception e)

}}

存錢執行緒:

public class depositthread implements runnable 

@override

public void run()

}}

取錢執行緒:

public class drawthread implements runnable 

@override

public void run()

}}

啟動:

public class testmain 

}

當執行存錢操作,增加該賬戶的餘額,將是否存錢標示符改為true,同時喚醒該同步鎖上的其他執行緒,存錢操作再次執行,則該執行緒進入睡眠狀態,取錢執行緒開始執行,減少餘額,將是否存錢標示符該為false,喚醒該同步鎖上的其他資源。

簡化版

@test

public

void

test13()

throws interruptedexception

catch

(interruptedexception e)

system.out.

println

("t1 再次獲取到鎖");

}}})

.start()

; thread.

sleep

(100);

synchronized

(obj)

while

(thread.

activecount()

>2)

system.out.

println

("run over");

}

使用locksupport

/**

* locksupport使用

*/@test

public

void

test02()

}); t01.

start()

;try

catch

(interruptedexception e)

system.out.

println

("解除t01的阻塞");

locksupport.

unpark

(t01)

;while

(thread.

activecount()

>2)

system.out.

println

("run over");

}

locksupport使用案例二

thread t01 =

newthread

(new

runnable()

}); t01.

start()

; thread.

sleep

(2000);

system.out.

println

("開始喚醒");

locksupport.

unpark

(t01)

;while

(thread.

activecount()

>2)

@test

public

void

test03()

throws interruptedexception

catch

(interruptedexception e)

system.out.

println

("結束阻塞");

}}})

; t01.

start()

; thread.

sleep

(2000);

synchronized

(obj)

while

(thread.

activecount()

>2)

system.out.

println

("run over");

}

使用案例-兩個執行緒交替執行

@test

public

void

test04()

catch

(interruptedexception e)}}

}});

t01.

start()

; thread t02 =

newthread

(new

runnable()

catch

(interruptedexception e)}}

}});

t02.

start()

;while

(thread.

activecount()

>2)

system.out.

println

("run over");

}

高階-三個執行緒交替執行

object obj01 =

newobject()

; object obj02 =

newobject()

; object obj03 =

newobject()

; thread t01 =

newthread

(new

runnable()

obj01.

wait()

;}catch

(interruptedexception e)}}

}});

t01.

start()

;//讓第乙個執行緒先跑起來

thread.

sleep

(1000);

thread t02 =

newthread

(new

runnable()

obj02.

wait()

;}catch

(interruptedexception e)}}

}});

t02.

start()

;//讓第二個執行緒執行起來

thread.

sleep

(1000);

thread t03 =

newthread

(new

runnable()

obj03.

wait()

;}catch

(interruptedexception e)}}

}});

t03.

start()

;while

(thread.

activecount()

>2)

system.out.

println

("run over"

);

參考

多執行緒案例 Java

1 購票 不安全策略 片段 public class main catch exception e new thread r start new thread r start new thread r start new thread r start 顯示結果 賣出了一張票,還剩下6張票 賣出了一張...

Java多執行緒 執行緒間通訊

一,等待 通知機制 實現執行緒間的通訊 舉個例子 我們去飯店就餐,飯店上餐的時間不確定,如果我們一直去詢問前台,是不是很煩,我麼這時就處於等待 wait 狀態,但是 飯店肯定會有人肯定會通知 notify 那個桌的菜已經做好了,前台就會通知這桌的人,菜來了。1,主要的方法wait notify 這個...

Java多執行緒經典案例

1.三個售票視窗同時 20張票 public class demo1 class ticketoffice implements runnable override public void run else catch interruptedexception e 2.建立兩個執行緒,其中乙個輸出1...