[JAVA 多线程] 生产者消费者实例

正好有人问,就直接将代码记录下来。

背景:有一个仓库存储货物,存在着生产者和消费者,设计一个可以并发的实现。

设计思路:设计一个仓库类,类中保存最大的容量限制和当前的count,类中包含生产和消费的方法,并且都是synchronized。

具体代码:

package com.test.tiny;

public class Store {
    private final int MAX_SIZE; //最大
    private int count; // 当前

    public Store(int n) {
        MAX_SIZE = n;
        count = 0;
    }

    public synchronized void add() {
        while(count >= MAX_SIZE) {
            System.out.println("已经满了");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        count++;
        System.out.println(Thread.currentThread().toString() + " put :" + count);
        this.notifyAll();
    }

    public synchronized void remove() {
        while(count <= 0) {
            System.out.println("已经空了");
            try {
                this.wait();
            }catch(Exception e) {
                e.printStackTrace();
            }
        }

        System.out.println(Thread.currentThread().toString() + " get :" + count);
        count--;
        this.notifyAll();
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Store s = new Store(5);
        Thread pro = new Producer(s);
        Thread con = new Consumer(s);
        Thread pro2 = new Producer(s);
        Thread con2 = new Consumer(s);

        pro.setName("生产者1");
        con.setName("消费者1");
        pro2.setName("生产者2");
        con2.setName("消费者2");

        pro.start();
        con.start();
        pro2.start();
        con2.start();
    }
}
class Producer extends Thread {
    private Store s;
    public Producer(Store s) {
        this.s = s;
    }
    public void run() {
        while(true) {
            s.add();
            try {
                Thread.sleep(1000);  // 为了直观,休息1秒
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

class Consumer extends Thread {
    private Store s;

    public Consumer(Store s) {
        this.s = s;
    }

    public void run() {
        while(true) {
            s.remove();
            try {
                Thread.sleep(1500); // 为了直观 多休息0.5秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
时间: 2024-11-06 16:47:19

[JAVA 多线程] 生产者消费者实例的相关文章

java多线程 生产者消费者模式

package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static void main(String[] args) { Godown godown = new Godown(50); for (int i = 0; i < 5; i++) { new ProducerThread(i * 10, godown).start(); new ConsumerThre

java 多线程-生产者消费者模式-管程法

生产者消费者模式管程法通过容器中介,将数据放入和取出 wait()导致当前线程等待,直到另一个线程调用该对象的notify()或notyfyAll()方法notify()唤醒正在等待对象监视器的单个线程,notifyAll()唤醒正在等待对象监视器的所有线程 public class tuble { public static void main(String[]args) { SynContainer container=new SynContainer(); new Productor(co

java 多线程生产者消费者

class Res { private String name; private int count = 1; private boolean flag; public synchronized void set(String name) { while (flag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.name = name + "--" + cou

java多线程 生产者消费者案例-虚假唤醒

package com.java.juc; public class TestProductAndConsumer { public static void main(String[] args) { Clerk clerk = new Clerk(); Produce produce = new Produce(clerk); Consumer consumer = new Consumer(clerk); new Thread(produce, "线程A").start(); ne

Java多线程-生产者/消费者模式实现

单生产者与单消费者 示例: public class ProduceConsume { public static void main(String[] args) { String lock = new String(""); Produce produce = new Produce(lock); Consume consume = new Consume(lock); new Thread(() -> { while (true) { produce.setValue();

java多线程生产者消费者

//Java Thread producer customer class ThreadTest { public static void main(String[] args) { Q q=new Q(); Producer p=new Producer(q); Customer c=new Customer(q); Thread t0=new Thread(p); Thread t1=new Thread(c); t0.start(); t1.start(); for(int i=0;i<5

Java 多线程 生产者消费者问题

1 package producer; 2 3 public class SyncStack { 4 int index =0; 5 SteamedBun[] bunArr = new SteamedBun[6]; //栈里只能放6个元素 6 7 public synchronized void push(SteamedBun bun) 8 { 9 while(index >= bunArr.length) //栈满等待 10 { 11 bun.setIndex(bunArr.length -1

Java多线程--生产者与消费者问题

说明 Java中,线程之间的通信主要是由java.lang.Object类提供的wait.notify和notifyAll这3个方法来完成: ①对象的wait方法被调用后,线程进入对象的等待队列中,并释放对象锁,其它线程可以竞争使用此对象锁:sleep方法使得一个线程进入睡眠状态,但是线程所占有的资源并没有释放. ②当对象的notify方法被调用,该方法会从对象的等待队列中随机取出一个线程来唤醒:notifyAll是唤醒等待队列中所有线程,这些线程会与其它正在执行的线程共同竞争对象锁. ③wai

Java实现生产者消费者问题与读者写者问题

摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/消费者问题的方法可分为两类:(1)采用某种机制保护生产者和消费者之间的同步:(2)在生产者和消费者之间建立一个管道.第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式.第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强. 同步问题核心在