生产者消费者阻塞队列版

package com.atgu;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

class MyResource{
    private volatile boolean FLAG=true;
    AtomicInteger atomicInteger=new AtomicInteger();
    BlockingQueue<String> blockingQueue=null;

    public MyResource(BlockingQueue<String> blockingQueue) {
        this.blockingQueue = blockingQueue;
        System.out.println("传入了---"+blockingQueue.getClass().getName());
    }

    public void myProducer() throws Exception{

        String date=null;
        boolean retVal;
        while (FLAG){
            date=atomicInteger.incrementAndGet()+"";
            retVal=blockingQueue.offer(date,2L,TimeUnit.SECONDS);
            if (retVal)
            {
                System.out.println(Thread.currentThread().getName()+date+"  插入成功");
            }
            else
            {
                System.out.println(Thread.currentThread().getName()+date+"  插入失败");
            }
            try {
                            TimeUnit.SECONDS.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }



        }
        System.out.println(Thread.currentThread().getName() + "\t 停止生产,表示FLAG=false,生产结束");




    }

    public void myConsumer() throws Exception{

        String result=null;

        while (FLAG){
            result=blockingQueue.poll(2,TimeUnit.SECONDS);


            if (result!=null&&result!="")
            {
                System.out.println(Thread.currentThread().getName()+result+"  取出成功");
            }
            else
            {
                FLAG=false;
                System.out.println(Thread.currentThread().getName()+"\t消费失败,队列中已为空,退出");
                return;
            }

        }

    }

    public void stop(){
        FLAG=false;
    }


}
public class ProducerConsumerWithBlockingQueueDemo {
    public static void main(String[] args) {
        MyResource myResource = new MyResource(new ArrayBlockingQueue<String>(10));

        new Thread(()->{
            System.out.println(Thread.currentThread().getName() + "\t 生产线程启动\n\n");
            try {
                myResource.myProducer();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"producer").start();
        new Thread(()->{
            System.out.println(Thread.currentThread().getName() + "\t 消费线程启动\n\n");
            try {
                myResource.myConsumer();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"consumer").start();

        try {
                        TimeUnit.SECONDS.sleep(5);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
        System.out.println("\n\n5秒中后,生产和消费线程停止,线程结束");
        myResource.stop();


    }
}

 

上一篇:八十八、SAP中ALV事件之二,事件的定义和事件子例程


下一篇:REUSE_ALV_FIELDCATALOG_MERGE根据结构名称创建GT_FIELDCAT