java線程“生產/消費”模型2


/*  資源類 */
class ShareValue {private int total;//判斷對象是否為空private boolean isEmpty=true;//判斷對象是否已滿private boolean isFull=true;public ShareValue(int total) {this.total = total;if(total>0) isEmpty=false;if(total<1000) isFull=false;}/** synchronized 方法控制對類成員變量的訪問:每個類實例對應一把鎖,每個 synchronized 方法都必須獲得調用該方法的類實例的鎖方能執行,* 否則所屬線程阻塞,方法一旦執行,就獨占該鎖,直到從該方法返回時才將鎖釋放,此后被阻塞的線程方能獲得該鎖,重新進入可執行狀態。* 這種機制確保了同一時刻對于每一個類實例,其所有聲明為 synchronized 的成員函數中至多只有一個處于可執行狀態* (因為至多只有一個能夠獲得該類實例對應的鎖),從而有效避免了類成員變量的訪問沖突(只要所有可能訪問類成員變量的方法均被聲明為 synchronized)。* */synchronized void putValue(int value){//取得當前線程名String name=Thread.currentThread().getName();while(isFull){display("Full ! ["+name+"] waites.");try {this.wait();} catch (InterruptedException e) {System.out.println(e);}}total+=value;if(total>1000){isFull=true;}display(name+",put: "+value+",old value: "+(total-value)+",now value"+total);isEmpty=false;//通知所有的等待線程notifyAll();}synchronized int getValue(int value){String  name=Thread.currentThread().getName();while(isEmpty || total<value){display("Empty or not enough! ["+name+"] waits.");			try {//進入等待狀態this.wait();} catch (InterruptedException e) {System.out.println(e);}}display(name+" get: "+value+",old value:"+total+",now value :"+(total-value));if(total-value>=0){total-=value;}if(total==0){isEmpty=true;}if(total<1000){isFull=false;}//通知所有等待的線程notifyAll();return value;}int getNowTotal(){return total;}private void display(String string) {System.out.println(string);}
}/*  生產者類  */
class Producer extends Thread {// 共享的ShareValue對象ShareValue share;// 要增加的值int value;public Producer(String name, ShareValue share, int value) {super(name);this.share = share;this.value = value;}public void run() {//同步share對象 ,直到當前代碼塊運行完畢后,share的對象鎖才會釋放synchronized (share) {try {sleep(100);} catch (InterruptedException e) {System.out.println(e);}share.putValue(value);}}
}/*消費者類*/
class Consumer extends Thread{//共享的ShareValue對象ShareValue share;//要減少的值int value;public Consumer(String name,ShareValue share, int value) {super(name);this.share = share;this.value = value;}public void run(){	//同步share對象,直到當前代碼運行完畢后,share的對象鎖才會釋放synchronized (share) {try {sleep(100);} catch (InterruptedException e) {System.out.println(e);}share.getValue(value);}}
} /*  測試主類  */
public class TestDemo {public static void main(String[] args) {ShareValue share=new ShareValue(0);Producer producer1=new Producer("producer1", share, 100);Consumer consumer=new Consumer("consumer", share, 300);Producer producer2=new Producer("producer2",share,950);Producer producer3=new Producer("producer3",share,50);
//		Producer producer4=new Producer("producer4",share,50);
//		Producer producer5=new Producer("producer5",share,50);producer1.start();consumer.start();producer2.start();producer3.start();
//		producer4.start();
//		producer5.start();}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374166.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux更改用戶名_破舊安卓手機第二春,在安卓手機上使用Linux_deploy運行Linux

由于服務器位于國外&#xff0c;害怕被墻掉導致數據丟失&#xff0c;所以在本地寫了腳本每小時從服務器上導出并下載到本地。但是電腦不可能二十四小時開機&#xff0c;所以很想買一個樹莓派4玩玩。但是太貴遼&#xff0c;還好搜索到了Android運行Linux的方法&#xff0c;下面記…

關于Cocos2d-x中init方法和onEnter方法的區別

init()和onEnter()這兩個方法都是寫實例化對象的類(比如繼承自Node的一些類等等)的時候用到的方法。 一般都是public類型下面的 bool init(); void onEnter(); 兩個方法在實現的時候都要先執行父類方法&#xff0c;比如 Node::init(); Node::onEnter(); 注意&#xff1a; 1.ini…

在5分鐘內在MacOSX Lion中設置JAVA_HOME,MAVEN_HOME,ANT_HOME

人們一直試圖通過Mac上的Java開發世界來解決這個問題&#xff0c;這一直是我一直遇到的問題。 他們必須解決的第一件事就是設置適當的工具和環境。 幸運的是&#xff0c;足夠多的MacOSX &#xff08;Lion或以前的版本&#xff09;仍然有許多重要的工具可用于Java開發&#xff0…

MCUXpress IDE常用設置

NXP的開發工具Xpress是基于eclipse制作的&#xff0c;我們如果需要設置一些東西可以直接搜索eclipse是怎么設置的。 1、字體大小 搜索eclipse字體大小&#xff0c;菜單Window > Preference 而Xpress是漢化了的&#xff0c;英語不好的同學可能懵逼&#xff0c;其實就是菜單欄…

C語言中空格符、空字符、字符數組結束符、換行、回車的區別

空格符和空字符是不一樣的,在ASCII里面,空格(space)符號的ASCII碼是32,而空字符是0, 2個是完全不一樣的2個字符 空字符 一般來描述一個字符串的結尾,其實是控制符的一種,但不能理解為沒有字符,應該理解為代表什么都沒有的字符.好比回車0x0A和換行0x0D雖然不顯示,但是也是控制字…

hdu5823 (附帶數的二進制子集)

二進制數子集的取法,結果不會輸出0&#xff0c;且從大到小 for(int i0 i;i0;i0(i0-1)&i)cout<<i0<<endl; 題意&#xff1a; 給定一個 N個點的圖&#xff0c; 求它的每一個子圖的最小染色數 染色方法是所有子圖中相連接兩點顏色不一致 其中 N≤18 題解&…

anaconda如何卸載庫_小白必看!Anaconda安裝全攻略

本文作者&#xff1a;戴 雯文字編輯&#xff1a;方 言技術總編&#xff1a;張馨月爬蟲俱樂部云端課程來襲&#xff01;爬蟲俱樂部將于2020年8月25日至28日在線上舉行Stata數據分析法律與制度專題訓練營&#xff0c;主要是為了讓學員掌握Stata軟件進階操作&#xff0c;涉及…

RESTful Web服務可發現性,第4部分

這是有關使用Spring 3.1和Spring Security 3.1和基于Java的配置來建立安全的RESTful Web Service的系列文章的第四篇 。 本文將重點介紹REST API&#xff0c;HATEOAS的可發現性以及由測試驅動的實際方案。 引入REST可發現性 API的可發現性是一個值得引起足夠關注的主題&#x…

10位IT領袖給應屆畢業生的10條忠告

10位IT領袖給應屆畢業生的10條忠告&#xff0c;在走向獨立和自主的偉大征程中&#xff0c;吸取他們的經驗。 在畢業生們邁出象牙塔之時&#xff0c;他們應該聽從哪些人的建議&#xff1f;在走向獨立和自主的偉大征程中&#xff0c;他們該吸取哪些教訓&#xff1f;聽一聽各領域…

ubuntu安裝好后常用軟件安裝和配置

1、安裝vim sudo apt install vim 安裝好后進入路徑打開vimrc文件&#xff0c;這里需要注意一定要用sudo不然編輯后無法保存&#xff01; cd /etc/vim sudo vim vimrc 在最下面加入 set nu set ts4 set softtabstop4 set shiftwidth4 set expandtab set autoindent 依次是…

Objective-c 數據類型

這里列出Objective-c中獨有數據類型&#xff1a; 一、字符串 在Objective-c中&#xff0c;字符串常量是由和一對從引號括起的字符串序列。比如&#xff1a;"China"、"objective-c"等都是合法的字符串常量。 二、id類型 id類型是Objective-c中一個比較獨…

JBoss AS 7 EJB3池配置

現在&#xff0c;AS 7.0.1已經發布&#xff0c;讓我們看一下可用的EJB3新功能。 就像我在上一篇文章中提到的那樣 &#xff0c;AS 7.0.1現在允許您為無狀態會話bean和MDB配置池。 當前&#xff0c;我們允許在子系統級別配置池&#xff0c;這意味著該池將適用于服務器上部署的所…

iOS開發網絡篇—文件的上傳

說明&#xff1a;文件上傳使用的時POST請求&#xff0c;通常把要上傳的數據保存在請求體中。本文介紹如何不借助第三方框架實現iOS開發中得文件上傳。 由于過程較為復雜&#xff0c;因此本文只貼出部分關鍵代碼。 主控制器的關鍵代碼&#xff1a; YYViewController.m 1 #import…

var模型的matlab實現_Eviews中VAR模型的操作、脈沖響應分析和方差分解的實現

打開文件所在位置&#xff0c;獲取數據。選中變量右鍵open打開var操作EViews,在VAR對象的工具欄中選擇“View”|“Lag Structure”|“AR Roots Table/ AR Roots Graph”選項&#xff0c;得到AR根的表和圖。結果顯示&#xff1a;VAR模型所有根模的倒數都小于1&#xff0c;即都在…

一個程序員的愛情表白書

我能抽象出整個世界 但是我不能抽象出你 因為你在我心中是那么的具體 所以我的世界并不完整 我可以重載甚至覆蓋這個世界里的任何一種方法 但是我卻不能重載對你的思念 也許命中注定了 你在我的世界里永遠的烙上了靜態的屬性 而我不慎調用了愛你這個方法 當我義無返顧的…

結構體、枚舉類型

一、結構體 結構體&#xff1a;就是一個自定義的集合&#xff0c;里面可以放各種類型的元素&#xff0c;用法大體跟集合一樣。 1、定義的方法&#xff1a; struct student { public int nianling; public int fenshu; public string name; public string sex; public int sum; …

NXP KW38開發雜記(一)MCUXpress 運行進入NMI_Handler

這里是大佬的具體分析過程&#xff0c;感興趣可以看看 https://www.cnblogs.com/wenhao-Web/p/13618703.html 解決辦法&#xff1a; 在startup_mkw38a4.c文件里&#xff0c;定位到Flash_Config {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE}; 把最后一個參數0xFFFFFFFE改…

25個讓Java程序員更高效的Eclipse插件

Eclipse提供了一個可擴展插件的開發系統。這就使得Eclipse在運行系統之上可以實現各種功能。這些插件也不同于其他的應用&#xff08;插件的功能是最難用代碼實現的&#xff09;。擁有合適的Eclipse插件是非常重要的&#xff0c;因為它們能讓Java開發者們無縫的開發基于J2EE和服…

NXP KW38藍牙開發(一)入門第一課:官網藍牙廣播和連接例程,NMI禁止

首先要下載開發使用的IDE&#xff1a;MCUXpresso IDE 下載鏈接&#xff1a; 進入nxp的官網&#xff0c;搜索KW38 向下翻看&#xff0c;找到Xpresso&#xff0c;點擊進入 習慣使用IAR開發的同學也可以下IAR版本&#xff0c;這里以Xpresso為例 下載好后安裝&#xff0c;一路默…

rough and crude

rough:物理上的粗糙或者說不平&#xff0c;高爾夫球場的生草區 crude:原始、未經加工的那種粗&#xff0c;即沒有精加工轉載于:https://www.cnblogs.com/dgyw/p/5767078.html