线程---消费生产

Posted 6530265oule

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程---消费生产相关的知识,希望对你有一定的参考价值。

/*
        线程
    生产和消费
*/

class SynStack 
{
    private char[] data = new char[6];
    private int cnt = 0; //表示数组有效元素的个数
    
    public synchronized void push(char ch)
    {
        while (cnt == data.length)
        {
            try
            {
                this.wait();
            }
            catch (Exception e)
            {
            }
        }
        this.notify(); 
        
        data[cnt] = ch;
        ++cnt;
        System.out.printf("生产线程正在生产第%d个产品,该产品是: %c
", cnt, ch);
    }
    
    public synchronized char pop()
    {
        char ch;
        
        while (cnt == 0)
        {
            try
            {
                this.wait();
            }
            catch (Exception e)
            {
            }
        }
        this.notify();
        ch = data[cnt-1];
        
        System.out.printf("消费线程正在消费第%d个产品,该产品是: %c
", cnt, ch);
        
        --cnt;
        return ch;        
    }    
}

class Producer implements Runnable
{
    private SynStack ss = null;
    
    public Producer(SynStack ss)
    {
        this.ss = ss;
    }
    
    public void run() // throws Exception
    {
        //push(‘a‘);  //error
        char ch;
        
        for (int i=0; i<20; ++i)
        {
//            try{
//            Thread.sleep(100);
//            }
//            catch (Exception e){            
//            }
                
            ch = (char)(‘a‘+i);
            ss.push(ch);
        }
    }
}

class Consumer implements Runnable
{
    private SynStack ss = null;
    
    public Consumer(SynStack ss)
    {
        this.ss = ss;
    }
    
    public void run()
    {
        for (int i=0; i<20; ++i)
        {
            try{
            Thread.sleep(100);
            }
            catch (Exception e){            
            }
            
            //System.out.printf("%c
", ss.pop());
            ss.pop();
        }
    }
}


public class TestPC
{
    public static void main(String[] args)
    {
        SynStack ss = new SynStack();
        Producer p = new Producer(ss);
        Consumer c = new Consumer(ss);
        Thread t1 = new Thread(p);
        t1.start();
                
        Thread t2 = new Thread(c);
        t2.start();
    }
}

技术分享图片

 

以上是关于线程---消费生产的主要内容,如果未能解决你的问题,请参考以下文章

LINUX多线程(生产者消费者模型,POXIS信号量)

java多线程远程协作(狂神说)附上课代码

并行模式之生产者-消费者模式

生产者消费者中多线程安全问题(即线程间通信的安全问题)

SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介创建消息生产者创建消息消费者自定义消息通道分组与持久化设置 RoutingKey)(代码片段

Java生产消费者模型——代码解析