62,628
社区成员
发帖
与我相关
我的任务
分享
class Resource {
private String name;
private int count = 0;
private boolean flag = false; // false表示资源中没有一个资源,true表示有一个资源
// |资源对象生产一个资源|
public synchronized void set(String name) {
System.out.println(Thread.currentThread().getName() + "正在生产");
// 功能1
while (flag) // 不断{检测Resource中是否有资源,有资源时唤醒一个线程,等待}
try {
System.out.println(Thread.currentThread().getName() + "发现有一只烤鸭,通知下一个线程,进入冻结");
wait();
} catch (InterruptedException e) {
}
this.name = name + ++count;
System.out.println(Thread.currentThread().getName() + "...生产..." + this.name);
flag = true;
System.out.println("生产完烤鸭,叫醒一个进程," + Thread.currentThread().getName() + "进入冻结");
System.out.println(Thread.currentThread().getName() + "已冻结");
notifyAll();
}
// |消费对象消费一个资源|
public synchronized void out() {
System.out.println(Thread.currentThread().getName() + "正在消费");
while (!flag) // 不断{不断{检测Resource中是否有资源,无资源时唤醒一个线程,等待}
try {
System.out.println(Thread.currentThread().getName() + "发现没有烤鸭,通知下一个线程,进入冻结");
wait();
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread().getName() + "...消费..." + this.name);
flag = false;
System.out.println("吃完烤鸭了,叫醒一个进程," + Thread.currentThread().getName() + "进入冻结");
System.out.println(Thread.currentThread().getName() + "已冻结");
notifyAll();
}
}
// 生产者类
class Producer implements Runnable {
private Resource r;
Producer(Resource r) {
this.r = r;
}
public void run() {
// 一个生产者对象不断{使用r生产烤鸭}
while (true) {
r.set("烤鸭");
}
}
}
// 消费者类
class Consumer implements Runnable {
private Resource r;
Consumer(Resource r) {
this.r = r;
}
public void run() {
// 一个消费者对象不断{使用r消费烤鸭}
while (true) {
r.out();
}
}
}
class Demo {
public static void main(String[] args) {
Resource r = new Resource();
Producer pro1 = new Producer(r);
Producer pro2 = new Producer(r);
Consumer con = new Consumer(r);
Thread p1 = new Thread(pro1, "生产者1号");
Thread p2 = new Thread(pro2, "生产者2号");
Thread c1 = new Thread(con, "消费者1号");
p1.start();
p2.start();
c1.start();
}
}
吃完烤鸭了,叫醒一个进程,消费者1号进入冻结
消费者1号已冻结
消费者1号正在消费
消费者1号发现没有烤鸭,通知下一个线程,进入冻结
生产者2号...生产...烤鸭73747
生产完烤鸭,叫醒一个进程,生产者2号进入冻结
生产者2号已冻结
生产者2号正在生产
生产者2号发现有一只烤鸭,通知下一个线程,进入冻结
生产者1号发现有一只烤鸭,通知下一个线程,进入冻结
消费者1号...消费...烤鸭73747
吃完烤鸭了,叫醒一个进程,消费者1号进入冻结
消费者1号已冻结
消费者1号正在消费
消费者1号发现没有烤鸭,通知下一个线程,进入冻结
生产者1号...生产...烤鸭73748
生产完烤鸭,叫醒一个进程,生产者1号进入冻结
生产者1号已冻结
生产者1号正在生产
生产者1号发现有一只烤鸭,通知下一个线程,进入冻结
生产者2号发现有一只烤鸭,通知下一个线程,进入冻结
消费者1号...消费...烤鸭73748
吃完烤鸭了,叫醒一个进程,消费者1号进入冻结
消费者1号已冻结
消费者1号正在消费
消费者1号发现没有烤鸭,通知下一个线程,进入冻结
生产者2号...生产...烤鸭73749
生产完烤鸭,叫醒一个进程,生产者2号进入冻结
/*
描述:
有3个类:资源类,生产者类,消费者类
资源类可以生产生产者类指定名称的资源,消费者类可以消费资源类的资源
目的:
2个生产者使用同一个生产器生产资源,1个消费者消费该生产器生产的资源(一次只能生产/消费一个)
步骤:
资源对象r;
功能1:|不断{不断{检测Resource中是否有资源,有资源时唤醒一个线程,等待},无资源时{生产资源,唤醒一个线程,进入冻结}}|
功能2:|不断{不断{检测Resource中是否有资源,无资源时唤醒一个线程,等待},有资源时{消费资源,唤醒一个线程,进入冻结}}|
2个生产者对象pro不断{使用r.功能1}
1个消费者对象con不断{使用r.功能2}
问题:
为什么两个生产者互相唤醒,而不唤醒被冻结的消费者?
*/
//资源类
class Resource
{
private String name;
private int count = 0;
private boolean flag = false; //false表示资源中没有一个资源,true表示有一个资源
//|资源对象生产一个资源|
public synchronized void set(String name)
{
System.out.println(Thread.currentThread().getName() + "正在生产");
//功能1
while(flag) //不断{检测Resource中是否有资源,有资源时唤醒一个线程,等待}
try
{
System.out.println(Thread.currentThread().getName() + "发现有一只烤鸭,通知下一个线程,进入冻结");
notify();
this.wait();
}
catch(InterruptedException e){}
this.name = name + ++count;
System.out.println(Thread.currentThread().getName() + "...生产..." + this.name);
flag = true;
//notify();
try
{
System.out.println("生产完烤鸭,叫醒一个进程," + Thread.currentThread().getName() + "进入冻结");
notify();
System.out.println(Thread.currentThread().getName() + "已冻结");
this.wait();
}
catch(InterruptedException e){}
}
//|消费对象消费一个资源|
public synchronized void out()
{
System.out.println(Thread.currentThread().getName() + "正在消费");
while(!flag) //不断{不断{检测Resource中是否有资源,无资源时唤醒一个线程,等待}
try
{
System.out.println(Thread.currentThread().getName() + "发现没有烤鸭,通知下一个线程,进入冻结");
notify();
this.wait();
}
catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName() + "...消费..." + this.name);
flag = false;
try
{
System.out.println("吃完烤鸭了,叫醒一个进程," + Thread.currentThread().getName() + "进入冻结");
notify();
System.out.println(Thread.currentThread().getName() + "已冻结");
this.wait();
}
catch(InterruptedException e){}
//notify();
}
}
//生产者类
class Producer implements Runnable
{
private Resource r;
Producer(Resource r)
{
this.r = r;
}
public void run()
{
//一个生产者对象不断{使用r生产烤鸭}
while(true)
{
r.set("烤鸭");
}
}
}
//消费者类
class Consumer implements Runnable
{
private Resource r;
Consumer(Resource r)
{
this.r = r;
}
public void run()
{
//一个消费者对象不断{使用r消费烤鸭}
while(true)
{
r.out();
}
}
}
class Demo
{
public static void main(String[] args)
{
Resource r = new Resource();
Producer pro1 = new Producer(r);
Producer pro2 = new Producer(r);
Consumer con = new Consumer(r);
Thread p1 = new Thread(pro1, "生产者1号");
Thread p2 = new Thread(pro2, "生产者2号");
Thread c1 = new Thread(con, "消费者1号");
p1.start();
p2.start();
c1.start();
}
}