`
阅读更多
package Thread;

public class ProducerConsumer 
{
    
public static void main(String[] args) 
    
{
        SynchronizedStack ss 
= new SynchronizedStack();
        Producer p 
= new Producer(ss); //产生一个生产者
        Consumer c = new Consumer(ss); //产生一个消费者
        new Thread(p).start(); //启动生产者线程
        new Thread(c).start(); //启动消费者线程
        
    }


}


class Bread //定义生产面包
{
    
int id;
    Bread(
int id)
    
{
        
this.id = id;
    }

    
    
public String toString() //重写toString方法
    {
        
return "bread :" + id;
    }

}


class SynchronizedStack //定义一个盛面包的容器
{
    
int index = 0;
    Bread[] bread 
= new Bread[6];
    
    
public synchronized void putIn(Bread bread) // 放进方法
    {
        
while(index == this.bread.length)
        
{
            
try 
            
{
                
this.wait(); // 只针对synchronized
//Object对象的wait()方法,表示调用当前对象的wait()方法,运行当前对象的此方法的线程等待,直到被notify()唤醒
            }
 
            
catch (InterruptedException e) 
            
{
                e.printStackTrace();
            }

        }

        
this.notify(); //唤醒一个wait的线程
//        this.notifyAll();//唤醒所有wait的线程
        this.bread[index] = bread;
        index 
++;
    }

    
    
public synchronized Bread putOut() // 拿出方法
    {
        
while(index == 0)
        
{
            
try 
            
{
                
this.wait();
            }
 
            
catch (InterruptedException e) 
            
{
                e.printStackTrace();
            }

        }

        
this.notify(); //唤醒一个wait的线程
//        this.notifyAll();//唤醒所有wait的线程
        index --;
        
return bread[index];
    }

}


class Producer implements Runnable
{
    SynchronizedStack ss 
= null;
    Producer(SynchronizedStack ss)
    
{
        
this.ss = ss;
    }

    
public void run() 
    
{
        
for(int i=0;i<30;i++)
        
{
            Bread bread 
= new Bread(i);
            ss.putIn(bread);
            System.out.println(
"生产了 :" + bread);
            
try
            
{
//                Thread.sleep(1000);
                Thread.sleep((int)Math.random() * 1000);
            }

            
catch(InterruptedException e)
            
{
                e.printStackTrace();
            }

        }

    }

}


class Consumer implements Runnable
{
    SynchronizedStack ss 
= null;
    Consumer(SynchronizedStack ss)
    
{
        
this.ss = ss;
    }

    
public void run() 
    
{
        
for(int i=0;i<30;i++)
        
{
            Bread bread 
= ss.putOut();
            System.out.println(
"消费了 :" + bread);
            
try
            
{
//                Thread.sleep(1000);
                Thread.sleep((int)Math.random() * 1000);
            }

            
catch(InterruptedException e)
            
{
                e.printStackTrace();
            }

        }

    }

}
分享到:
评论

相关推荐

    多生产者与多消费者问题c++源码

    多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多...

    生产者消费者问题

    生产者消费者问题,C++。生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者...

    生产者消费者问题总结

    生产者消费者问题总结 信号量概念总结 经典生产者-消费者问题 较为复杂的生产者-消费者问题 华南理工大学生产者和消费者问题 个人总结

    Linux下生产者消费者问题的实现

    利用互斥锁和计数信号完成生产者消费者问题 一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中...

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...

    生产者-消费者问题的模拟实现(课设含源代码).doc

    通过研究进程并发和信号量机制,实现生产者-消费者问题的并发控制。 2、设计要求 1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者进程的标识符。 说明:...

    线程问题生产者消费者流程图

    生产者消费者流程图; 生产者消费者流程图。

    用多进程同步方法演示“生产者-消费者”问题

    1、设计目的:通过研究Linux的进程机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为1-20个整数。 3、设计要求: 生产者和消费者进程的数目不固定,可...

    生产者消费者问题 MFC 实现

    多线程同步互斥 生产者消费者问题 MFC 实现

    以记录型信号量实现生产者-消费者问题

    以记录型信号量实现生产者-消费者问题 实验目的: 1.加深对进程同步概念的理解。 2.理解多道程序环境中,不同进程对资源访问及相互合作进程的关系的处理方法。 实验要求: 利用C语言程序模拟生产者-消费者问题和哲学...

    Win丨linux丨操作系统实验二:生产者——消费者问题

    操作系统实验二:生产者——消费者问题 1. 在Windows操作系统上,利用Win32 API提供的信号量机制,编写应用程序实现生产者——消费者问题。 2. 在Linux操作系统上,利用Pthread API提供的信号量机制,编写应用程序...

    生产者消费者问题C/C++源程序

    此外,在vc2005上运行时,由于WaitForMultiObjects函数只能等待64个线程,因此,只要生产者和消费者总数不超过64个就没问题,实际上,即使超过64个线程,通过修改WaitForMultiObjects函数等待对象个数为64,也是可以...

    生产者消费者问题(信号量)(linux)实现代码

    参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者...

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题

    华南理工大学操作系统实验:生产者消费者问题

    参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者...

    C语言实现生产者消费者问题

    C语言实现生产者消费者问题,分配具有n个缓冲区的缓冲池,作为共享资源。 定义两个资源型信号量empty 和full,empty信号量表示当前空的缓冲区数量,full表示当前满的缓冲区数量。 定义互斥信号量mutex,当某个进程...

    进程同步实验——生产者与消费者问题算法实现

    进程同步实验——生产者与消费者问题算法实现

Global site tag (gtag.js) - Google Analytics