相關(guān)資訊
- 幾何畫(huà)板工具箱具體使用方法
- 《戰(zhàn)國(guó)無(wú)雙4-2》怎么換服裝?戰(zhàn)國(guó)無(wú)
- 關(guān)于責(zé)任的名言警句大全
- 《戰(zhàn)國(guó)無(wú)雙4-2》PC版如何聯(lián)機(jī)? 戰(zhàn)
- 戰(zhàn)國(guó)無(wú)雙4-2技能覺(jué)醒牛逼嗎 全新
- 《戰(zhàn)國(guó)無(wú)雙4-2》手柄無(wú)效怎么解決
- 戰(zhàn)國(guó)無(wú)雙4-2如何設(shè)置語(yǔ)言 戰(zhàn)國(guó)無(wú)雙
- 戰(zhàn)國(guó)無(wú)雙4-2怎么樣跳過(guò)進(jìn)入開(kāi)場(chǎng)動(dòng)畫(huà)
- 什么是應(yīng)屆生畢業(yè)生
- 應(yīng)屆生簡(jiǎn)歷自我評(píng)價(jià)
本類(lèi)常用軟件
-
福建農(nóng)村信用社手機(jī)銀行客戶端下載下載量:584204
-
Windows優(yōu)化大師下載量:416898
-
90美女秀(視頻聊天軟件)下載量:366961
-
廣西農(nóng)村信用社手機(jī)銀行客戶端下載下載量:365699
-
快播手機(jī)版下載量:325855
sleep是讓線程暫停指定的時(shí)間,wait是讓線程等待,知道有notify方法出現(xiàn)在繼續(xù)運(yùn)行,sleep不釋放對(duì)象鎖,wait釋放對(duì)象鎖。這在很多地方都有寫(xiě)到,但沒(méi)有例子不好理解
import java.util.ArrayList; import java.util.List; public class thread { public List list=new ArrayList(); Integer i=0;//新建一個(gè)對(duì)象,隨便什么,就為了借用它的鎖而已。 public static void main(String[] args){ thread th=new thread(); A a=th.new A(); B b=th.new B(); Thread add=new Thread(a); Thread get=new Thread(b); add.start(); get.start(); } class A extends Thread{ public void run(){ synchronized(i){ try { //Thread.sleep(1000); i.wait();//這里調(diào)用了對(duì)象i的wait方法,那么就表示所在線程暫時(shí)放棄i的對(duì)象鎖,并阻塞在這里,同時(shí)把機(jī)會(huì)讓給同樣使用i鎖的B線程執(zhí)行 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for(int j=0;j
從如上代碼中可見(jiàn),線程B是負(fù)責(zé)向集合中加值的,線程A是負(fù)責(zé)從集合中取值的,如果不進(jìn)行同步處理,那么如果兩個(gè)線程同時(shí)運(yùn)行,那么A可能在B加入值之前就從集合中取值,那么就會(huì)報(bào)錯(cuò),所以必須進(jìn)行同步代碼的操作(也可以加入flag來(lái)判斷是否到了A中從集合里取值的時(shí)機(jī))。
而用sleep就沒(méi)有上面的功能了,因?yàn)閺拇a中可以發(fā)現(xiàn),不管是A線程先搶到cpu開(kāi)始執(zhí)行還是B線程先執(zhí)行,他們中的一個(gè)肯定會(huì)拿到i的鎖的,但拿到后i的鎖就沒(méi)有使用wait方法釋放過(guò),那假設(shè)B先拿到鎖了,向list中加入值完成了,那也別指望A能打印出來(lái),因?yàn)锳一直阻塞在(i){