标签: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视频库。如果您有公开的资源,可以分享给我的话,用您的资源学习也可以。
博文是观看视频后,融入思考写成的。博文好,是老师讲得好。博文坏,是 给最苦 没认真。
标签:generated ons 博文 问题 star obj zed author err
原文地址:http://www.cnblogs.com/jizuiku/p/7638701.html