java併發程式設計一一多執行緒之間通訊 一

2021-08-28 01:11:59 字數 3495 閱讀 9724

多執行緒之間通訊,其實就是多個執行緒在操作同乙個資源,但是操作的動作不同。

需求:第乙個執行緒寫入(input)使用者,另乙個執行緒讀取(out)使用者。實現讀乙個,寫乙個操作。

**示例:

class res
class intthrad extends thread 

@override

public void run() else

count = (count + 1) % 2;}}}

class outthread extends thread 

@override

public void run()

}}

res res = new res();

intthrad intthrad = new intthrad(res);

outthread outthread = new outthread(res);

intthrad.start();

outthread.start();

結果:資料會發生錯亂,造成執行緒安全問題。

在intthrad 加上synchronized

class intthrad extends thread 

@override

public void run() else

count = (count + 1) % 2;

}} }

}

輸出執行緒加上synchronized

class res 

class inputthread extends thread

@override

public void run() else

count = (count + 1) % 2;

} } }}

class outthrad extends thread

@override

public void run()

} }}public class threaddemo01

}

因為涉及到物件鎖,他們必須都放在synchronized中來使用。wait、notify一定要在synchronized

裡面進行使用。

wait必須暫定當前正在執行的執行緒,並釋放資源鎖,讓其他執行緒可以有機會執行。

class res 

class intthrad extends thread

@override

public void run() catch (exception e)

}if (count == 0) else

count = (count + 1) % 2;

res.flag = true;

// 喚醒當前執行緒

res.notify();

}} }}

class outthread extends thread

@override

public void run() catch (exception e)

}system.out.println(res.username + "--" + res.user***);

res.flag = false;

res.notify();

}} }}

public class threacommun

}

對於sleep()方法,我們首先要知道該方法書屬於thread類中的,而wait() 方法,則是屬於object類中的。

sleep()方法導致了程式暫停執行指定的時間,讓出cpu該其它執行緒,但是他的監控狀態依然保持者,

當指定的時間到了又會自動恢復執行狀態。

在呼叫sleep()方法的時候,執行緒不會釋放物件鎖。

而當呼叫wait() 方法的時候,執行緒會放棄物件鎖,進而等待此物件的等待鎖定池,只有針對此物件

呼叫notify()方法後本執行緒才進入物件索定池準備

獲取物件鎖進入執行狀態。

在jdk1.5 之後,並發包中新增了lock介面(以及相關實現類)用來實現鎖功能,lock介面提供了與

synchronized關鍵字類似的同步功能,但需要在使用時手動獲取鎖和釋放鎖。

lock lock  = new reentrantlock();

lock.lock();

tryfinally

lock介面可以嘗試非阻塞地獲取鎖,當前執行緒嘗試獲取鎖。如果這一時刻沒有被其他執行緒獲取到,

則成功獲取並持有鎖。

lock介面能被中斷的獲取鎖與synchronized不同,獲取到鎖的執行緒能夠相應中斷,當獲取到鎖的

執行緒被中斷時,中斷異常將會被丟擲,同時鎖會被釋放。

lock介面在指定的截止時間之前獲取鎖,如果截止時間到了依舊無法獲取鎖,則返回。

condition的功能類似於在傳統的執行緒技術中的,object.wait() 和 obect.notify() 的功能。

**示例:

condition condition = lock.newcondition();

res. condition.await(); 類似wait

res. condition. signal() 類似notify

class res

class inputthread extends thread

@override

public void run() catch (exception e)

}if (count == 0) else

count = (count + 1) % 2;

res.flag = true;

// res.notify();

newcondition.signal();

} catch (exception e) finally

} // } }}

class outthrad extends thread

@override

public void run() catch (exception e)

}system.out.println(res.username + "," + res.***);

res.flag = false;

// res.notify();

newcondition.signal();

} catch (exception e) finally

// }

} }}public class threaddemo01

}

併發程式設計 多執行緒之間通訊

多執行緒之間實現通訊 多執行緒之間如何實現通訊 什麼是多執行緒之間通訊?多執行緒之間通訊,其實就是多個執行緒在操作同乙個資源,但是操作的動作不同。畫圖演示 多執行緒之間通訊需求 需求 第乙個執行緒寫入 input 使用者,另乙個執行緒取讀取 out 使用者.實現讀乙個,寫乙個操作。實現基本實現 共享...

併發程式設計筆記(一) 多執行緒

一 我們為什麼要使用多執行緒 首先要了解一點,我們跑程式最耗時的是io讀寫,所以會出現來了很多請求,卻要等待第乙個請求io結束才能繼續接受下乙個請求,非常影響效率 另外,單執行緒的請求處理是線性的,前端發起請求需要等待後台所有的都處理結束前端才有響應,非常影響體驗。針對這兩點,多執行緒的優勢在於 1...

Java多執行緒併發程式設計之變數

共享意味著多個執行緒可以同時訪問,可變意味著其值在生命週期可以改變。例如以下 count 變數 執行緒不安全的類 public class unsafecount public intgetcount 有4種方式可以修復這個問題 因為方法中變數是每個執行緒獨佔的,不和其它執行緒共享。比如 publi...