标签: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