java多線程之間通信的幾種方式:
Thread提供的suspend()和resume()方法(已棄用-了解一下):
提供掛起線程的功能枷恕,但是由于掛起不釋放鎖。在對象鎖的執(zhí)行代碼塊內(nèi)容易造成死鎖。
suspend必須先于resume執(zhí)行宣脉,否則也會造成死鎖宁昭。
Object類提供的wait()/notify()/notifyAll()方法:
只能在對象鎖持有者線程內(nèi)調(diào)用(同步控制方法內(nèi)調(diào)用),否則會拋出IllegalMonitorStateException異常相种。
wait方法使當前線程等待威恼,加入對象的等待集合中去,自動釋放對象鎖。
notify/notifyAll:喚醒一個或所有等待線程箫措。
順序調(diào)用要求:wait必須先于notify調(diào)用缭黔,否則會使線程一直出去waiting狀態(tài)。
juc包下的park()/unpark()機制:
part相當與等待許可蒂破,unpark為提供許可馏谨。因此沒有調(diào)用順序的要求。
多次調(diào)用unpark后在調(diào)用park附迷,線程執(zhí)行惧互。多次unpart無法疊加。第一個park線程執(zhí)行喇伯。后面的park線程等待喊儡,
需要在調(diào)用unpark喚醒線程。
線程中斷:stop稻据、共享變量艾猜、Thread的interrupt方法
stop:已棄用,強制停止線程捻悯,拋棄所有鎖匆赃,可能會導致代碼邏輯問題。
共享變量:通過控制共享變量控制線程今缚。
interrupt:將線程的中斷狀態(tài)設置為true算柳。
線程之間等待:
線程A調(diào)用線程B的join方法,那么線程A就要等到線程B執(zhí)行完成后在繼續(xù)執(zhí)行姓言。