Java实现生产者消费者问题

实现一个队列。

队列的应用场景为:

一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列

1、Consumer.java

package com.week.pv;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * 消费者
 * @author xingqijiang
 */
public class Consumer implements Runnable {

    private Queue<Integer> queue = new LinkedList<Integer>();

    public Consumer(Queue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            while (true) {
                if (Thread.currentThread().isInterrupted())
                    break;
                int data;
                synchronized (queue) {
                    if (queue.size() == 0) {
                        queue.wait();
                        queue.notifyAll();
                    }
                    data = queue.poll();
                }
                System.out.println(
                        Thread.currentThread().getId() + " 消费了:" + data +  " 已出队");
                Thread.sleep(1000);
            }

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

    }

}

2、Producer.java

package com.week.pv;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;


public class Producer implements Runnable {
    private Queue<Integer> queue = new LinkedList<Integer>();
    private int length;

    public Producer(Queue<Integer> queue, int length) {
        this.queue = queue;
        this.length = length;
    }

    @Override
    public void run() {
        try {
            while (true) {

                if (Thread.currentThread().isInterrupted())
                    break;
                Random r = new Random();
                int temp = r.nextInt(100);
                System.out.println(Thread.currentThread().getId() + " 生产了:" + temp);
                synchronized (queue) {
                    if (queue.size() >= length) {
                        queue.notifyAll();
                        queue.wait();
                    } else
                        queue.add(temp);
                }
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}

3、Main.java

package com.week.pv;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * 主函数
 * @author xingqijiang
 *
 */
public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<Integer>();
        int length = 5;
        Producer p1 = new Producer(queue,length);
        Consumer c1 = new Consumer(queue);

        ExecutorService service = Executors.newCachedThreadPool();
        service.execute(p1);
        service.execute(c1);

    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

计算机中的数学【水仙花数】求解自然数中所有的水仙花数

在数论中,水仙花数(Narcissistic number),也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、...

1702
来自专栏pangguoming

android中一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值

 在项目中,有时候在一些控件(如Button、TextView)中要添加一些符号,如下图所示: ? ? 这个时候可以使用图片的方式来显示,不过这些可以直接使用U...

9924
来自专栏

Cassandra API60 Java 代码示例

文档地址 http://wiki.apache.org/cassandra/API06,实现了绝大部分示例

1974
来自专栏算法修养

pta 习题集5-18 打印学生选课清单

假设全校有最多40000名学生和最多2500门课程。现给出每门课的选课学生名单,要求输出每个前来查询的学生的选课清单。 输入格式: 输入的第一行是两个正整...

32910
来自专栏swag code

HeapSort-堆排序-完全二叉树

堆可以看成是一棵完全二叉树,根节点永远是最大的值。每个根的子节点有两个,左子节点是2*i+1,右子节点是2*i+2。每个子节点的父节点是(i-1)/2。子节点...

2194
来自专栏码匠的流水账

聊聊flink的SourceFunction

flink-streaming-java_2.11-1.6.2-sources.jar!/org/apache/flink/streaming/api/func...

2643
来自专栏恰童鞋骚年

数据结构基础温故-6.查找(上):基本查找与树表查找

只要你打开电脑,就会涉及到查找技术。如炒股软件中查股票信息、硬盘文件中找照片、在光盘中搜DVD,甚至玩游戏时在内存中查找攻击力、魅力值等数据修改用来作弊等,都要...

1373
来自专栏杨龙飞前端

jquery-base64.js插件使用

4415
来自专栏desperate633

Java并发之ScheduledThreadPoolExecutor在Executor中延时执行任务在Executor中周期的执行任务

ScheduledExecutorService类顾名思义,就是可以延迟执行的Executor。如果,对于某些任务,我们并不想马上执行,而是想让任务过一段时间后...

1011
来自专栏小樱的经验随笔

POJ 2492 A Bug's Life

A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions:...

29110

扫码关注云+社区

领取腾讯云代金券