码迷,mamicode.com
首页 > 编程语言 > 详细

JavaSE8基础 生产者和消费者 简单示例

时间:2017-10-08 22:27:43      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:generated   ons   博文   问题   star   obj   zed   author   err   

礼悟:
           好好学习多思考,尊师重道存感恩。叶见寻根三返一,活水清源藏于零。
           虚怀若谷良心主,皓月当空自在王。愿给最苦行无悔,诚劝且行且珍惜。




    os :windows7 x64
    jdk:jdk-8u131-windows-x64
    ide:Eclipse Oxygen Release (4.7.0)



资源类:

package blog.jizuiku2;

/**
 * 资源类
 * 
 * @author jizuiku 
 * @version V17.09.27
 */
public class Book {
	private String name;
	private int price;
	/**
	 * 提示该资源是否完成生产
	 * true -> 完成生产
	 * false -> 没有完成生产 
	 * */ 
	private boolean flag = false;
	
	public boolean isFlag() {
		return flag;
	}
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
	
}

 
锁类:

package blog.jizuiku2;

/**
 * 	向外界提供同一把锁
 * 
 * @author jizuiku
 * @version V17.09.27
 */
public class Lock {
	public static Object lock = new Object();
}

 
生产者类:    

package blog.jizuiku2;

/**
 * 生产者
 * 
 * @author jizuiku
 * @version V17.09.27
 */
public class SetBookThread implements Runnable {

	private Book book = null;
	private int num = 0;

	public SetBookThread(Book book) {
		super();
		// TODO Auto-generated constructor stub
		this.book = book;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {

			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
						
			synchronized (Lock.lock) {
				
				// 这个if语句要放在 同步代码块里面
				// 给最苦 之前把if语句块放在了外面
				if(book.isFlag()) {
					try {
						Lock.lock.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
				if (num % 2 != 0) {
					book.setName("______道德经");
					book.setPrice(69);
				} else {
					book.setName("金刚经");
					book.setPrice(96);
				}
				num++;
				
				// 生产好了,标志变为true
				book.setFlag(true);
				// 唤醒线程
				Lock.lock.notify();
			}

		}

	}

}

 
消费者类:

package blog.jizuiku2;

/**
 * 消费者
 * 
 * @author jizuiku
 * @version V17.09.27
 */
public class GetBookThread implements Runnable {

	// 用于记数
	private int num = 0;

	// 消费的资源
	private Book book = null;

	public GetBookThread(Book book) {
		super();
		this.book = book;
	}

	@Override
	public void run() {
		// TODO Auto-generated method

		while (true) {
			// TODO Auto-generated method stub
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			// 生产者和消费者必须要同一把锁
			synchronized (Lock.lock) {
				
				if (!book.isFlag()) {
					// 如果资源还没有被生产好
					try {
						Lock.lock.wait(); // 消费者线程先等待一会,并释放 Lock.lock
											// 一会醒过来的时候,是从这里醒来的
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

				System.out.println((num++) + this.book.getName() + " " + this.book.getPrice());

				// 生产好了,标志变为false
				book.setFlag(false);
				// 唤醒线程,并不是立刻执行,还需要抢占CPU的执行权
				Lock.lock.notify();
			}
		}

	}

}

 

测试类:

package blog.jizuiku2;

/**
 * 测试类
 * 
 * @author jizuiku
 * @version V17.09.27
 */
public class Demo {
	public static void main(String[] args) {
		// 在外界创建资源对象
		Book book = new Book();

		// 然后通过 生产者和消费者的构造函数 把资源传入

		// 生产者
		SetBookThread sbt = new SetBookThread(book);
		// 消费者
		GetBookThread gbt = new GetBookThread(book);

		/*
		 * 有的时候 消费者会首先抢到执行权,那就会输出 null-0,然而这个是不好的 
		 * 需要对这个问题作出解决方案
		 */

		/*
		 * 有的时候,生产者会一直抢到执行权,总是生产,消费者虽然很想买,但是执行权一直抢不到... 
		 * 需要对这个问题作出解决方案
		 */

		/*
		 * A:生产者 先看是否有资源,有就等待,没有就生产.资源生产出来后,要通知消费者,"我这有东西来,快来买." 
		 * B:消费者 先看是否有资源,有就买,没有就等待并且通知生产者,"我要买东西啦,快些生产."
		 */

		new Thread(sbt).start();
		new Thread(gbt).start();
	}
}

 

运行结果:
技术分享

 

 

感想:

  多线程这里确实难,给最苦 虽然跟着视频教程写出了代码,但是 过几天再看的时候,就又迷糊了。还需要多加练习!

 

 


Java优秀,值得学习。
学习资源:itcast和itheima视频库。如果您有公开的资源,可以分享给我的话,用您的资源学习也可以。
博文是观看视频后,融入思考写成的。博文好,是老师讲得好。博文坏,是 给最苦 没认真。

JavaSE8基础 生产者和消费者 简单示例

标签:generated   ons   博文   问题   star   obj   zed   author   err   

原文地址:http://www.cnblogs.com/jizuiku/p/7638701.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!