黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

Java面向?qū)ο?/div>
Java異常
Java數(shù)組
Java常用類
Java集合
Java IO流
Java線程
Java反射
Socket編程
Java注解開發(fā)
Java GoF設(shè)計(jì)模式
HashMap
Java內(nèi)存模型
Java線性表

Java設(shè)計(jì)模式之生產(chǎn)者消費(fèi)者模式

package com.wkcto.chapter07.producerconsumer.p3;
/**
 * 生產(chǎn)者消費(fèi)者設(shè)計(jì)模式
 * 		在企業(yè)中有一組工人負(fù)責(zé)生產(chǎn), 有一組員工負(fù)責(zé)銷售, 他們都可以同時(shí)進(jìn)行工作
 * 		工人生產(chǎn)的產(chǎn)品存儲(chǔ)到倉(cāng)庫(kù)中, 如果倉(cāng)庫(kù)已滿, 需要等待銷售人員銷售后,再繼續(xù)生產(chǎn)
 * 		銷售人員從倉(cāng)庫(kù)中銷售產(chǎn)品, 如果倉(cāng)庫(kù)已空, 需要等待生產(chǎn)者生產(chǎn)了產(chǎn)品后再繼續(xù)銷售
 * 		工人在生產(chǎn)產(chǎn)品期間, 還沒有完全生產(chǎn)完, 不能銷售
 * 		產(chǎn)品在銷售過程中, 也不能再存儲(chǔ)到倉(cāng)庫(kù)中
 * 
 * 定義線程模擬不同的生產(chǎn) 者,  定義線程模擬不同的消費(fèi)者, 不管是生產(chǎn)者還是消費(fèi)者都需要借助倉(cāng)庫(kù)中轉(zhuǎn)
 * 
 * @author 蛙課網(wǎng)
 *
 */
public class Test01 {

	public static void main(String[] args) {
		//創(chuàng)建倉(cāng)庫(kù)對(duì)象
		MyStorage storage = new MyStorage();
		
		//創(chuàng)建三個(gè)生產(chǎn)者
		Producer lisi = new Producer(storage);
		Producer feifei = new Producer(storage);
		Producer xiaoming = new Producer(storage);
		
		lisi.setName("lisi");
		feifei.setName("feifei");
		xiaoming.setName("xiaoming");
		
		lisi.start();
		feifei.start();
		xiaoming.start();
		
		//創(chuàng)建三個(gè)消費(fèi)者
		Consumer yong = new Consumer(storage);
		Consumer zhang = new Consumer(storage);
		Consumer du = new Consumer(storage);
		
		yong.setName("yong");;
		zhang.setName("zhang");
		du.setName("du");
		
		yong.start();
		zhang.start();
		du.start();
		
	}

}
package com.wkcto.chapter07.producerconsumer.p3;
/**
 * 倉(cāng)庫(kù)類
 * @author 蛙課網(wǎng)
 *
 */
import java.util.LinkedList;

public class MyStorage {
	
	private LinkedList<String> list = new  LinkedList<>();  		//作為倉(cāng)庫(kù),保存產(chǎn)品
	private static final int MAX = 100; 		//定義常量,表示倉(cāng)庫(kù)的最大容量
	
	//向倉(cāng)庫(kù)中存儲(chǔ)產(chǎn)品 , 在存儲(chǔ)產(chǎn)品期間不允許消費(fèi)
	public synchronized void store( String  product) {		
		//如果倉(cāng)庫(kù)已滿 , 需要等待消費(fèi)者消費(fèi)
		while ( list.size() >= MAX) {
			try {
				this.wait(); 		//wait()/nofity()方法必須在同步代碼塊中,由鎖對(duì)象調(diào)用
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}		
		//存儲(chǔ)產(chǎn)品 
		list.offer(product);
		System.out.println("++++++++++++++" + Thread.currentThread().getName() + "存儲(chǔ)了" + product + "后,倉(cāng)庫(kù)容量:" + list.size());

		//通知消費(fèi)者消費(fèi)
		this.notify();
	}	
	//從倉(cāng)庫(kù)中取產(chǎn)品 , 生產(chǎn)者需要等消費(fèi)者取完產(chǎn)品后才能再存儲(chǔ)產(chǎn)品
	public synchronized void get() {
		//如果倉(cāng)庫(kù)已空, 消費(fèi)者需要等待
		while ( list.size() <= 0 ) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//取產(chǎn)品
		System.out.println( Thread.currentThread().getName() + "取了產(chǎn)品" + list.poll()+ "后,倉(cāng)庫(kù)容量:" + list.size());
		
		//通知生產(chǎn)者生產(chǎn)
		this.notifyAll();
	}
}
package com.wkcto.chapter07.producerconsumer.p3;

import java.util.Random;

/**
 * 定義生產(chǎn)者線程
 * 	生產(chǎn)了產(chǎn)品存儲(chǔ)到倉(cāng)庫(kù)中
 * @author 蛙課網(wǎng)
 *
 */
public class Producer extends Thread {
	MyStorage storate; 				//倉(cāng)庫(kù)
	
	public Producer(MyStorage storate) {
		super();
		this.storate = storate;
	}

	@Override
	public void run() {
		//不斷生產(chǎn)產(chǎn)品 
		for( int i = 1; i <= 100; i++){
			String product = "product:" + new Random().nextInt(200);
			storate.store( product  );
		}
	}
}
package com.wkcto.chapter07.producerconsumer.p3;
/**
 * 定義消費(fèi)者線程
 * 	消費(fèi)者從倉(cāng)庫(kù)中取產(chǎn)品
 * @author 蛙課網(wǎng)
 *
 */
public class Consumer extends Thread {
	MyStorage storate; 				//倉(cāng)庫(kù)
	
	public Consumer(MyStorage storate) {
		super();
		this.storate = storate;
	}

	@Override
	public void run() {
		//不斷消費(fèi)產(chǎn)品 
		for( int i = 1; i <= 100; i++){
			storate.get();
		}
	}
}

練習(xí):

package com.wkcto.chapter07.producerconsumer.p2;
/**
 * 創(chuàng)建兩個(gè)線程,一個(gè)線程打印奇數(shù),一個(gè)線程打印偶數(shù),實(shí)現(xiàn)兩個(gè)線程的交替打印
 * 		線程1 : 1
 * 		線程2 : 2
 * 		線程1 : 3
 * 		線程2 : 4
 * 		線程1 : 5
 * 		線程2 : 6
 * 		線程1 : 7
 * @author 蛙課網(wǎng)
 *
 */
public class Test {

	public static void main(String[] args) {
		PrintNum printNum = new PrintNum();
		
		//創(chuàng)建線程打印奇數(shù)
		new Thread(new Runnable() {			
			@Override
			public void run() {
				while( true ){
					printNum.printOdd();
				}
			}
		}).start();
		//創(chuàng)建線程打印偶數(shù)
		new Thread(new Runnable() {			
			@Override
			public void run() {
				while( true ){
					printNum.printEven();
				}
			}
		}).start();
	}

}
package com.wkcto.chapter07.producerconsumer.p2;
/**
 * 定義一個(gè)打印奇數(shù)和偶數(shù)的類
 * @author 蛙課網(wǎng)
 *
 */
public class PrintNum {
	private int num = 1; 			//保存要打印的數(shù)
	
	//打印奇數(shù)
	public synchronized void printOdd() {
		//當(dāng)num是偶數(shù)時(shí), 需要等待
		while( num % 2 == 0){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		//如果是奇數(shù)就打印
		System.out.println( Thread.currentThread().getName() + " : " + num );
		num++;  		//變?yōu)榕紨?shù)
		//通知打印偶數(shù)
		this.notify();
	}
	
	//打印偶數(shù)
	public synchronized void printEven() {
		//當(dāng)num是奇數(shù)時(shí), 需要等待
		while( num % 2 != 0){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		//如果是偶數(shù)就打印
		System.out.println( Thread.currentThread().getName() + " : " + num );
		num++;  		//變?yōu)槠鏀?shù)
		//通知打印奇數(shù)
		this.notify();
	}
	
}

 

主站蜘蛛池模板: 国产特黄特色a级在线视 | 国产高清国产专区国产精品 | 一级女人18片毛片免费视频 | 久久综合免费 | 日本高清一本视频 | 成人国产网站v片免费观看 成人国产一区二区三区 | 男女午夜爽爽大片免费 | 爽爽视频在线观看 | 久久99精品久久久久久秒播放器 | 五月婷婷视频在线 | 手机看片国产日韩 | 日韩美女一级毛片 | 国产高清免费在线观看 | 热99re久久精品香蕉 | 黄色片一级毛片 | 日日夜夜狠狠 | 人人狠狠| 亚洲人成网站在线观看播放动漫 | 久久人人爽人人爽人 | 日韩精品免费在线视频 | 国产麻豆va精品视频 | 国产日韩在线播放 | 2020欧美极品hd18 | 午夜精品视频在线看 | 国产色爽免费视频 | 日韩在线成人 | 亚洲成a人片在线观看www | 日本一区二区三区免费在线观看 | 国产精品一区二区久久精品 | 男女爽爽无遮挡午夜视频在线观看 | ak福利午夜在线观看 | 波多野结衣午夜 | 国产手机在线αⅴ片无码观看 | 一级毛片免费完整视频 | 久久午夜宅男免费网站 | 日皮视频免费 | 99免费精品视频 | 久久精品亚洲欧美日韩久久 | 国产成人精品日本亚洲专一区 | 日日夜夜天天 | 在线天堂资源 |