zoukankan      html  css  js  c++  java
  • 多线程模拟生产者消费者示例之wait/notify

    public class Test {

    public static void main(String[] args) throws InterruptedException {
    List<String> queue = new ArrayList<>();
    new Thread(new PThread(queue)).start();
    new Thread(new CThread(queue)).start();
    }
    }

    /**
    * 生产者
    */
    class PThread implements Runnable {
    private List<String> queue;
    private AtomicInteger i = new AtomicInteger();

    public PThread(List<String> queue) {
    this.queue = queue;
    }

    @Override
    public void run() {
    while (true) {
    synchronized(queue){
    //如果queue有元素,那么就释放锁吧
    if (queue.size() == 1) {
    try {
    queue.wait();// 释放锁
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    } else { //没有元素就生产一个元素
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    String data = i.getAndIncrement() + "";
    queue.add(data);
    System.out.println("生产者线程,生产一个元素:"+data);
    queue.notify(); //唤醒本线程,就可以获取锁了
    }
    }
    }
    }
    }

    /**
    * 消费者
    */
    class CThread implements Runnable {
    private List<String> queue;

    public CThread(List<String> queue) {
    this.queue = queue;
    }

    @Override
    public void run() {
    while (true) {
    synchronized (queue) {
    //如果queue中没有元素,就释放锁,让生产者去生产
    if (queue.size() == 0) {
    try {
    queue.wait(); //就释放锁
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    } else { //消费元素
    String data = queue.remove(0);
    System.out.println("消费者线程,消费一个元素:"+data);
    queue.notify();
    }
    }
    }
    }
    }
     

         

  • 相关阅读:
    Mybatis+Spring整合
    java 线程详解
    java 异常处理
    java 日期 时间操作
    RandomAccessFile 详解
    js导入excel
    java 常见异常
    常用的java程序片段(算法)
    IO流详解
    json 详解
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/9728702.html
Copyright © 2011-2022 走看看