2 qq 35913663 qq_35913663 于 2017.01.14 22:13 提问

java的生产者消费者同步问题,已经极力模仿教材,但是还是出现问题(没有输出结果)
/*问题:感觉是出现死锁,特别对于wait()和notify(),不知道Worker.produce()的notify()能不能唤醒Worker.move()的wait()n呢?请指教!
*/

import java.util.ArrayList;

public class Exercise22_2_Synchronized {

    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        Worker w=new Worker();
        Thread p=new Thread(new Producerr(w));
        Thread m=new Thread(new Moverr(w));
        p.start();
        m.start();

    }

}

/*电脑类,有两个静态成员 id和available,每新建一个电脑类对象id自动加一,available变为true(可用),available用来作为新对象是否可用的标志,被拿走之后便置为false*/
class Computerr
{
    private static int id=0;
    public static boolean available=false;
    Computerr()
    {
        id++;
        available=true;
    }

    public void printInformation()
    {
        System.out.println("这是第"+id+"台电脑...");
    }
}


/*此类为生产线程,用于产生一个电脑对象(和搬运线程Moverr使用同一个电脑类操作对象w调用w.produce()方法)*/
class Producerr implements Runnable
{
    Worker w;
    Producerr(Worker w)
    {
        this.w=w;
    }
    public void run()
    {
        w.produce();
    }
}

/*此类为搬运线程,用于收纳新产生的电脑对象,使用电脑类操作对象w,调用w.move()方法*/
class Moverr implements Runnable
{
    Worker w;
    Moverr(Worker w)
    {
        this.w=w;
    }
    @Override
    public void run() 
    {
        w.move();   
    }
}

/*此类为电脑类对象的操作(具体的产生和收纳工作步骤),分别给produce和move方法加锁,达到生产与搬运间的互斥*/
class Worker
{
    Computer cp;
    ArrayList<Computer> al=new ArrayList<>();
    public synchronized void produce()
    {
        while(true)
        {
            if(Computerr.available==false)
            {
                cp=new Computer();
                notify();
            }
            else
            {
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    public synchronized void move()
    {

        while(true)
        {
            if(Computerr.available==true)
            {
                al.add(cp);
                cp.available=false;
                al.get(al.size()-1);
                notify();
            }
            else
            {
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

2个回答

u010528826
u010528826   2017.01.14 22:33
已采纳

。。。。你全程没有写输出语句,定义个printInformation又不调用。能输出才是怪的。

还是 Worker 里面定义了 Computer 是写错了还是其他什么类?还是你Computerr写错了?

qq_35913663
qq_35913663 卧槽!丢人了~
一年多之前 回复
u010528826
u010528826 其他写的是对的,没得问题。
一年多之前 回复
qq_35913663
qq_35913663   2017.01.15 12:42
/*这是最新的代码,已经解决,感谢Mr-Yao的费心查看*/


import java.util.ArrayList;

public class Exercise22_2_Synchronized {

    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        Worker w=new Worker();
        Thread p=new Thread(new Producerr(w));
        Thread m=new Thread(new Moverr(w));
        p.start();
        m.start();

    }

}

/*电脑类,有两个静态成员 id和available,每新建一个电脑类对象id自动加一,available变为true(可用),available用来作为新对象是否可用的标志,被拿走之后便置为false*/
class Computerr
{
    private static int id=0;
    public static boolean available=false;
    Computerr()
    {
        id++;
        available=true;
    }

    public void printInformation()
    {
        System.out.println("这是第"+id+"台电脑...");
    }
}


/*此类为生产线程,用于产生一个电脑对象(和搬运线程Moverr使用同一个电脑类操作对象w调用w.produce()方法)*/
class Producerr implements Runnable
{
    Worker w;
    Producerr(Worker w)
    {
        this.w=w;
    }
    public void run()
    {
        w.produce();
    }
}

/*此类为搬运线程,用于收纳新产生的电脑对象,使用电脑类操作对象w,调用w.move()方法*/
class Moverr implements Runnable
{
    Worker w;
    Moverr(Worker w)
    {
        this.w=w;
    }
    @Override
    public void run() 
    {
        w.move();   
    }
}

/*此类为电脑类对象的操作(具体的产生和收纳工作步骤),分别给produce和move方法加锁,达到生产与搬运间的互斥*/
class Worker
{
    Computerr cp;
    ArrayList<Computerr> al=new ArrayList<>();
    public synchronized void produce()
    {
        while(true)
        {
            if(Computerr.available==false)
            {
                cp=new Computerr();
                notify();
            }
            else
            {
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }


        }
    }

    public synchronized void move()
    {

        while(true)
        {
            if(Computerr.available==true)
            {
                al.add(cp);
                Computerr.available=false;
                al.get(al.size()-1).printInformation();
                notify();
            }
            else
            {
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
操作系统实验之进程的互斥与同步(生产者与消费者问题)VC++
上课实验用VC++做的操作系统实验之进程的互斥与同步(生产者与消费者问题),内含实验报告,希望对大家有帮助
操作系统实验二:进程、线程之间的同步
1。生产者消费者问题(信号量+mutex) 参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。为了使得程序的输出易于看到结果,仿照阅读材料中的实例程序,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。 可选的实验:在上面实验的基础上实现部分消费者有选择地消费某些产品。例如一个消费者只消费小写字符,一个消费者只消费大写字母,而另一个消费者则无选择地消费任何产品。消费者要消费的产品没有时,消费者进程被阻塞。注意缓冲的管理。 2。用信号量和mutex方式实现睡觉的理发师问题 3。读者写者问题 教材和相关的阅读材料中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
进程间同步互斥经典问题(一)生产者-消费者问题
问题描述:生产者-消费者问题,也叫做缓存绑定问题(bounded-buffer),是一个多进程同步问题。 即有两个进程:制造少和消费者,共享一个固定大小的缓存 制造商的工作是制造一段数据,放进缓存,如此重复。 消费者一次消费一段数据,从缓存中取出。 要保证不让制造商在缓存还是满的时候仍要向内写数据,不让消费者试图从空的缓存中取出数据。 问题分析: 要避免多个生产商竞争一个
Java生产者消费者模式同步的问题
学习下生产者消费者模式下,线程同步的问题。当然对这些问题,Java已经在concurrent包下已经做了处理,以下代码仅仅为了学习下多线程wait和notify。 import java.util.concurrent.ArrayBlockingQueue; public class ProducerAndConsumer { public static void main(String[]
java模拟生产者与消费者问题(线程同步)
关于生产者与消费者的问题,百度百科上的定义是这样的:生产者消费者问题,也称有限缓冲问题,是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲
进程同步互斥经典题之消费者与生产者问题
操作系统进程同步互斥经典题之消费者与生产者问题
从生产者消费者窥探线程同步(上)
欢迎转载,转载请注明出处。尊重他人的一丢丢努力,谢谢啦! 阅读本篇之后,如果你觉得说得还有点道理,那不妨先戳一下从生产者消费者窥探线程同步(下) ,两篇一起嚼才更好呢。最近复习了下生产者消费者模式,虽然对它不太陌生,但要说认认真真地实现,还真从来没有过,这里将它总结一下,有不妥或者见识不到之处,欢迎留言指出。为什么要使用大概基于以下2点: (1)可以实现解耦 大多数设计模式,都会创造出一个第
进程线程之间的同步生产者消费者信号量读者写者写者优先
1。生产者消费者问题(信号量+mutex) 参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。为了使得程序的输出易于看到结果,仿照阅读材料中的实例程序,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。 可选的实验:在上面实验的基础上实现部分消费者有选择地消费某些产品。例如一个消费者只消费小写字符,一个消费者只消费大写字母,而另一个消费者则无选择地消费任何产品。消费者要消费的产品没有时,消费者进程被阻塞。注意缓冲的管理。 2。用信号量和mutex方式实现睡觉的理发师问题 3。读者写者问题 教材和相关的阅读材料中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
Linux下信号量实现进程同步、互斥(生产者消费者问题)
linux的进程同步互斥实现生产者和消费者
生产者与消费者模式(线程的同步与互斥)
条件变量 条件变量的提出首先要涉及一个概念,就是生产者消费者模型: 生产者消费者,是在多线程同步的一个问题,两个固定大小缓冲区的线程,在实际运行是会发生问题,生产者是生成数据放入缓冲区,重复过程,消费者在缓冲区取走数据。 生产者消费者的模型提出了三种关系,两种角色,一个场所 三种关系:  - 生产者之间的互斥关系  - 消费者之间的竞互斥关系  - 生