代码实现生产者消费者

生产者线程

 

public class ReadThread implements Runnable
{
    BlockingQueue<String> blocking;
    ReadThread(BlockingQueue<String> blocking)
    {
        this.blocking = blocking;
    }
    @Override
    public void run()
    {
        read();
    }
    public void read()
    {
        try
        {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    new FileInputStream(new File("D://1.txt"))));
            String line = "";
            while ((line = br.readLine()) != null)
            {
                System.out.println("向队列中添加:"+line);
                while (!blocking.offer(line))
                {
                    System.out.println("队列已满 进行等待");
                    Thread.sleep(100);
                }
            }
            ParseFileThread.idDone = true;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

 

消费者线程

public class ParseThread implements Runnable
{
    BlockingQueue<String> blocking;
   
    ParseThread(BlockingQueue<String> blocking)
    {
        this.blocking = blocking;
    }
   
    @Override
    public void run()
    {
        Parse();
    }
   
    public void Parse()
    {
        ExecutorService pool = Executors.newFixedThreadPool(3);
        try
        {
            for (int i = 0; i < 3; i++)
            {
                pool.execute(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        while (true)
                        {
                            String line = blocking.poll();
                            if(ParseFileThread.idDone && line==null)
                            {
                                //已经处理完
                                System.out.println("任务已经出来完~ 进行退出");
                                return;
                            }
                            else if(!ParseFileThread.idDone && line==null)
                            {
                                System.out.println("队列已空!进行等待");
                                try
                                {
                                    Thread.sleep(100);
                                }
                                catch (InterruptedException e)
                                {
                                    e.printStackTrace();
                                }
                            }else if(!ParseFileThread.idDone && line!=null)
                            {
                               System.out.println("从队列中获取:"+line);
                            }
                        }
                       
                    }
                });
            }
           
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        pool.shutdown();
    }
   
}

 

 

主函数

 

public class ParseFileThread
{
    private static BlockingQueue<String> blocking = new LinkedBlockingQueue<String>(3);
   
    public static Boolean idDone = false;
   
    public static void main(String[] args)
    {
        ExecutorService executor = Executors.newFixedThreadPool(2);
       
        executor.execute(new ReadThread(blocking));
        executor.execute(new ParseThread(blocking));
       
        executor.shutdown();

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生产者消费者问题是一个经典的同步问题,主要涉及到生产者和消费者两种角色,生产者生产数据,消费者消费数据,两者必须同步进行,避免生产者生产过多数据造成浪费,或者消费者消费过多数据造成程序崩溃等问题。 下面是一个简单的 Python 代码实现: ``` python import threading import time import random queue = [] MAX_NUM = 10 condition = threading.Condition() class ProducerThread(threading.Thread): def run(self): nums = range(5) global queue while True: condition.acquire() if len(queue) == MAX_NUM: print("Queue full, producer is waiting") condition.wait() print("Space in queue, Consumer notified the producer") num = random.choice(nums) queue.append(num) print("Produced", num) condition.notify() condition.release() time.sleep(random.random()) class ConsumerThread(threading.Thread): def run(self): global queue while True: condition.acquire() if not queue: print("Nothing in queue, consumer is waiting") condition.wait() print("Producer added something to queue and notified the consumer") num = queue.pop(0) print("Consumed", num) condition.notify() condition.release() time.sleep(random.random()) ProducerThread().start() ConsumerThread().start() ``` 在这个例子中,我们定义了一个队列 `queue`,最大长度为 `MAX_NUM`,用 `condition` 实现同步。生产者线程 `ProducerThread` 生产数据,消费者线程 `ConsumerThread` 消费数据,它们都会在队列长度达到最大值或者队列为空时等待,直到被唤醒。 我们可以通过调整 `MAX_NUM` 和线程的数量,来模拟不同的场景和效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值