多執行緒的互動

2022-08-03 02:48:13 字數 2425 閱讀 1003

當多個執行緒同時共享訪問同一資料時,每個執行緒都嘗試操作該資料,從而導致改資料被破壞,這種現象稱為爭用條件。

同步的實現:wait(),notify(),notifyall()   

當乙個執行緒要訪問共享資源,首先要拿到鎖後進入臨界區,如果發現某些條件不符合,呼叫wait方法釋放鎖資源,執行緒進入鎖物件上的wait set,

拿到鎖的當前執行程序執行完時呼叫notify()會喚醒鎖資源所持有的等待區域中的一條執行緒(隨機),使該執行緒有機會競爭cpu資源;

呼叫notifyall()會喚醒鎖資源所持有的等待區域中的所有執行緒,使這些執行緒有機會競爭cpu資源;

public

class

testsync implements runnable

public

void

run()

}class

timer

catch

(interruptedexception e) {}

system.

out.println(name+"

, 你是第

"+num+"

個使用timer的執行緒");

//}}}

死鎖問題:

public

class testdeadlock implements

runnable

catch

(exception e)

synchronized

(o2) }}

if(flag == 0)

catch

(exception e)

synchronized

(o1) }}

}

public

static

void

main(string args)

}

energysystem:

/**

* 宇宙的能量系統

* 遵循能量守恆定律:

* 能量不會憑空創生或消失,只會從一處轉移到另一處 */

public

class

energysystem

/*** 能量的轉移,從乙個盒子到另乙個盒子

* @param

from 能量源

* @param

to 能量終點

* @param

amount 能量值

*/public

void transfer(int from, int to, double

amount)

catch

(interruptedexception e)

}system.out.println(thread.currentthread().getname());

energyboxes[from] -=amount;

"從%d轉移%10.2f單位能量到%d", from, amount, to);

energyboxes[to] +=amount;

" 能量總和:%10.2f%n", gettotalenergies());

//喚醒所有在lockobj物件上等待的執行緒

lockobj.notifyall();}}

//獲取能量世界的能量總和

public

double

gettotalenergies()

//返回能量盒子的長度

public

intgetboxamount()

}

energytransfertask:

public

class energytransfertask implements

runnable

public

void

run()

}catch

(interruptedexception e)}}

public

class

energysystemtest }}

energysystemtest

輸出結果:

在for迴圈中from是遞加的,但結果並不是從0,1,2.......按順序轉移?

雖然程序按順序創造task但start方法不會等到run方法執行完就會繼續執行下面的**,所以導致建立了很多執行緒但他們隨機執行run方法。

關於鎖:synchronized與volatile
恐怕比較一下volatile和synchronized的不同是最容易解釋清楚的。volatile是變數修飾符,而synchronized則作用於一段**或方法;看如下三句get**:

多執行緒 執行緒互動

在實際功能中,會存在一些執行緒互動的情況。比如 乙個執行緒執行某個操作,當操作的物件到達某種狀態時,會等待其他執行緒來執行。下面 的功能是,乙個執行緒對乙個數字執行減少方法,當減到1時,等待增加執行緒操作。public class thread interactive extends thread ...

多執行緒三(互動)

1 wait notify notifyall 這單個方法是屬於object類的方法 wait 導致當前的執行緒等待,直到其他執行緒呼叫此物件的notify 方法或notifyall 方法 notify 喚醒在此物件監視器等待的乙個執行緒 notifyall 喚醒在此物件監視器上等待的所有執行緒 2...

010 多執行緒互動

1 使用join執行緒間排隊 2 使用wait notify 進行執行緒間互動 3 使用 countdownlatch進行執行緒互動等待執行緒id 11正在等待其他執行緒 等待執行緒id 11汽車 完成執行緒id 21正在工作 執行緒id 16正在工作 執行緒id 17正在工作 執行緒id 13正在...