`
dsxwjhf
  • 浏览: 73311 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

生产者消费者之 wait / notify

 
阅读更多
package com.wjxie.wait.notify;

public class Producer extends Thread {

    public Producer(String name) {
        super(name);
    }

    @Override
    public void run() {
        while (true) {
            synchronized (Main.queue) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }

                if (Main.queue.size() == Main.MAX_SIZE) {
                    try {
                        Main.queue.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    Item item = new Item();
                    Main.queue.offer(item);
                    // 生产一次之后,立马释放锁。一方面让消费者消费,另一方面让其他生产者生产。
                    Main.queue.notify();
                    System.out.println(this.getName() + " produce " + item);
                }
            }
        }
    }

}



package com.wjxie.wait.notify;

public class Consumer extends Thread {

    public Consumer(String name) {
        super(name);
    }

    @Override
    public void run() {
        while (true) {
            synchronized (Main.queue) {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }

                if (Main.queue.size() == 0) {
                    try {
                        Main.queue.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    Item item = Main.queue.poll();
                    // 消费一次之后,立马释放锁。一方面让生产者生产,另一方面让其他消费者消费。
                    Main.queue.notify();
                    System.out.println(this.getName() + " consume " + item);
                }
            }
        }
    }

}



package com.wjxie.wait.notify;

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

public class Main {

    // 最大容量
    public static final int MAX_SIZE = 100;
    // 容器,兼作排它锁
    public static Queue<Item> queue = new LinkedList<Item>();

    public static void main(String[] args) {
        Thread p = new Producer("[P]");
        Thread p2 = new Producer("[P2]");
        Thread c = new Consumer("[C]");
        Thread c2 = new Consumer("[C2]");
        p.start();
        p2.start();
        c.start();
        c2.start();
    }

}



package com.wjxie.wait.notify;

public class Item {

    private int id;

    public Item() {
        id = ID.getID();
    }

    @Override
    public String toString() {
        return "Item[" + id + "]";
    }

    static class ID {

        private static int id = 0;

        public static int getID() {
            return ++id;
        }

    }

}

分享到:
评论

相关推荐

    Java 同步方式 wait和notify/notifyall

    下面是一个简单的生产者消费者模型示例,演示了`wait()`, `notify()` 的使用: ```java public class Buffer { private int data; private boolean available = false; public synchronized void put(int item)...

    浅谈Java线程间通信之wait/notify

    Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式。 wait()方法将当前线程置于等待状态,直到其他线程调用notify()或...

    java生产者消费者

    在Java中,实现生产者消费者模式主要有两种方式:使用阻塞队列(BlockingQueue)和使用wait/notify机制。 1. 阻塞队列(BlockingQueue)实现: Java的`java.util.concurrent`包提供了多种阻塞队列实现,如...

    wait_notify_demo

    `wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...

    生产者 消费者 模式 c++

    生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等...

    生产者消费者问题c++实现

    生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的同步和异步操作。在C++中,我们可以利用标准库中的互斥量(mutex)、条件变量(condition_variable)等工具来实现这个问题...

    java代码-wait-notify 生产者消费者

    在"java代码-wait-notify 生产者消费者"的场景下,`wait()`方法让当前持有锁的线程暂停执行并释放锁,进入等待状态,直到其他线程调用`notify()`或`notifyAll()`唤醒它。而`notify()`方法会随机选择一个等待在这个...

    生产者消费者Java—synchronized 机制

    在Java编程中,生产者消费者模型是一种典型的多线程问题,用于解决资源的共享和并发控制。这个模型中,生产者负责生成数据,而消费者负责消耗这些数据。在这个项目中,开发者利用`synchronized`关键字来实现线程同步...

    java多线程实现生产者消费者关系

    以下是一个简单的基于synchronized关键字和wait/notify机制的生产者消费者示例: ```java import java.util.LinkedList; public class ProducerConsumerExample { private final LinkedList&lt;Object&gt; buffer = new...

    java生产者消费者问题

    为了解决生产者和消费者之间的问题,Java提供了一系列的同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及高级的BlockingQueue接口。 首先,我们要理解生产者消费者模型的基本概念。在该...

    java多线程实现生产者和消费者

    在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...

    C++ PV操作(生产者/消费者)简单实例

    当容器满时(`food.length == index`),通过调用 `wait()` 方法阻止生产者继续生产,直到有消费者消费了一个元素并调用了 `notify()`。 - `public synchronized void pop()`:消费者从容器中取出一个元素。如果...

    生产者 消费者 进程 可视化 java

    完整的程序应该包括生产者和消费者线程如何处理 `wait()`, `notify()` 以及如何在适当的时候调用 `suspend()` 和 `resume()` 的逻辑。 在多线程环境中,可视化是一个有用的工具,可以帮助开发者观察和理解线程间的...

    Java多线程实现生产者消费者

    本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...

    多线程_生产者与消费者模式示例

    5. **wait/notify机制**:生产者和消费者线程通过`wait()`和`notify()`方法进行通信。当队列满时,生产者调用`wait()`进入等待状态;队列有空位时,消费者完成消费后调用`notify()`唤醒等待的生产者。同样,队列为空...

    Java生产者与消费者

    在Java编程中,"生产者与消费者"模式是一种经典的多线程问题,它涉及到了并发处理和资源管理。这个模式的核心思想是通过共享一个有限的缓冲区,使得生产者线程可以将产品放入缓冲区,而消费者线程则可以从缓冲区取出...

    JAVA实现线程间同步与互斥生产者消费者问题

    生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则负责消费这些数据。关键在于,生产者不应在没有消费者准备接收的情况下生成数据,同时消费...

    生产者消费者JAVA课程设计

    //下面的消费者类对象和生产者类对象所操作的是同一个同步堆栈对象 Producer p1 = new Producer(stack,ce); new Thread(p1).start();//生产者线程启动 Consumer c1 = new Consumer(stack,ce); new Thread(c1)....

    java生产者消费者模式

    在Java中,使用wait() / notify()方法实现生产者消费者模式的一般步骤: 1. 定义共享资源,通常是一个容器,如上述代码中的LinkedList。 2. 使用synchronized关键字创建同步代码块,确保同一时间只有一个线程能访问...

    生产者与消费者 java实现

    `Buffer`类中的`put()`和`take()`方法使用`synchronized`关键字保证了线程安全,并使用`wait()`和`notifyAll()`来控制生产者和消费者的执行顺序。 在`Main`类中,我们创建了两个线程,一个作为生产者,另一个作为...

Global site tag (gtag.js) - Google Analytics