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

Java面向對象
Java異常
Java數組
Java常用類
Java集合
Java IO流
Java線程
Java反射
Socket編程
Java注解開發
Java GoF設計模式
HashMap
Java內存模型
Java線性表

Java設計模式之生產者消費者模式

package com.wkcto.chapter07.producerconsumer.p3;
/**
 * 生產者消費者設計模式
 * 		在企業中有一組工人負責生產, 有一組員工負責銷售, 他們都可以同時進行工作
 * 		工人生產的產品存儲到倉庫中, 如果倉庫已滿, 需要等待銷售人員銷售后,再繼續生產
 * 		銷售人員從倉庫中銷售產品, 如果倉庫已空, 需要等待生產者生產了產品后再繼續銷售
 * 		工人在生產產品期間, 還沒有完全生產完, 不能銷售
 * 		產品在銷售過程中, 也不能再存儲到倉庫中
 * 
 * 定義線程模擬不同的生產 者,  定義線程模擬不同的消費者, 不管是生產者還是消費者都需要借助倉庫中轉
 * 
 * @author 蛙課網
 *
 */
public class Test01 {

	public static void main(String[] args) {
		//創建倉庫對象
		MyStorage storage = new MyStorage();
		
		//創建三個生產者
		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();
		
		//創建三個消費者
		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;
/**
 * 倉庫類
 * @author 蛙課網
 *
 */
import java.util.LinkedList;

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

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

import java.util.Random;

/**
 * 定義生產者線程
 * 	生產了產品存儲到倉庫中
 * @author 蛙課網
 *
 */
public class Producer extends Thread {
	MyStorage storate; 				//倉庫
	
	public Producer(MyStorage storate) {
		super();
		this.storate = storate;
	}

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

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

練習:

package com.wkcto.chapter07.producerconsumer.p2;
/**
 * 創建兩個線程,一個線程打印奇數,一個線程打印偶數,實現兩個線程的交替打印
 * 		線程1 : 1
 * 		線程2 : 2
 * 		線程1 : 3
 * 		線程2 : 4
 * 		線程1 : 5
 * 		線程2 : 6
 * 		線程1 : 7
 * @author 蛙課網
 *
 */
public class Test {

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

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

 

全部教程
主站蜘蛛池模板: 国产一卡2卡3卡四卡精品网站 | 欧美成人精品免费播放 | 亚洲国产精品91 | 亚洲性夜夜综合久久麻豆 | 欧美在线一区二区三区不卡 | 福利一区二区在线 | 天天摸夜夜添夜夜添国产 | 日日a.v拍夜夜添久久免费 | 精品欧美日韩一区二区三区 | 高清性色生活片97 | 小明免费| 奇米伊人 | 曰批全过程免费视频播放网站 | 草碰视频| 成人黄色小视频 | 在线视频不卡国产在线视频不卡 | 中文字幕精品亚洲无线码二区 | a毛片全部免费播放 | 黄色三级在线视频 | 日韩毛片一级 | 热热色视频 | 国产94在线传媒麻豆免费观看 | 4虎影视国产在线观看精品 4k岛国精品午夜高清在线观看 | 久久婷婷午色综合夜啪 | 无码免费一区二区三区免费播放 | 欧美日韩一区二区三区免费不卡 | 性做久久久久久久免费看 | 国产网站免费 | 夜色福利院在线看 | 国产成人a一区二区 | 在线中文字幕精品第5页 | 国产成人精品日本亚洲专区6 | 欧美福利片在线观看 | 一级毛片免费 | 日韩三级影院 | 日韩欧美视频二区 | 欧洲1区二区三区二页 | 亚洲一区二区在线免费观看 | 成人免费在线视频观看 | 99精品在线观看视频 | 欧美色爱综合 |