`

通过wait和notify实现的生产者消费者demo

阅读更多
import java.util.ArrayList;
import java.util.List;

/**
 * 通过wait和notify实现的生产者消费者demo
 * User: zhangb
 * Date: 12-12-1
 * Time: 下午7:19
 */
public class ProducerAndCustomerDemo {
    private static int capacity = 150;
    private static List<String> basket = new ArrayList<String>(capacity);

    public static void main(String[] args) {
        // 多生产者与多消费者
        int producerSize = 2;
        Thread[] ps = new Thread[producerSize];
        for (int i = 0, step = 500; i < producerSize; i ++) {
            ps[i] = new Thread(new Producer((i) * step, (i+1) * step), "生产-->线程--" + (i+1));
            ps[i].start();
        }

        int customerSize = 10;
        Thread[] cs = new Thread[customerSize];
        for (int i = 0; i < customerSize; i ++) {
            cs[i] = new Thread(new Customer(), "消费线程--" + (i+1));
            cs[i].start();
        }

        // 等待生产线程结束并中断消费线程
        for (int i = 0; i < producerSize; i ++) {
            try {
                ps[i].join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for (int i = 0; i < customerSize; i ++) {
            cs[i].interrupt();
        }
    }

    static class Producer implements Runnable {
        private int start;
        private int end;

        Producer(int start, int end) {
            this.start = start;
            this.end = end;
        }

        @Override
        public void run() {
            for (int i = start; i < end; i ++) {
                synchronized (basket) {
                    try {
                        while (basket.size() == capacity) {
                            basket.wait();
                        }
                        String p = " PRO" + i;
                        System.out.println(Thread.currentThread().getName() + p);
                        basket.add(p);
                        basket.notifyAll();
                        Thread.yield(); // 让出当前线程的执行权,有利于看出交替线程运行的效果
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        break;
                    }
                }
            }
        }
    }

    static class Customer implements Runnable {
        @Override
        public void run() {
            while (true) {
                synchronized (basket) {
                    try{
                        while (basket.size() == 0) {
                            basket.wait();
                        }
                        System.out.println(Thread.currentThread().getName() + basket.remove(0));
                        basket.notifyAll();
                    } catch (InterruptedException e) {
                        System.out.println(Thread.currentThread().getName() + "退出");
                        break;
                    }
                }
            }
        }
    }
}
分享到:
评论

相关推荐

    wait_notify_demo

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

    java 多线程生产者消费者模型demo

    在`demo`项目中,可能包含一个生产者类(Producer)和一个消费者类(Consumer)。生产者类创建产品并将其放入队列,同时使用`put`方法(如果队列满则阻塞);消费者类从队列中取出产品并处理,使用`take`方法(如果...

    java线程安全以及生产者消费者demo

    而生产者消费者模型是一种设计模式,用于解决资源分配和消耗的问题,它通过共享缓冲区来协调生产者和消费者线程之间的通信。 线程安全主要涉及到以下几个方面: 1. **同步机制**:Java提供了多种同步机制,如`...

    java多线程练习demo 基本的线程使用方式 生产者消费者练习 龟兔赛跑练习.zip

    Java提供了一些内置的同步机制,如`synchronized`关键字、`wait()`和`notify()`方法,用于确保线程安全和实现线程间的协调。此外,`java.util.concurrent`包提供了丰富的并发工具类,如`Semaphore`(信号量)、`...

    生产与消费

    该模式通过一个队列来协调生产者线程和消费者线程,实现线程间的解耦,提高系统的整体性能。本文将通过分析一个简单的Java程序来深入探讨生产者-消费者模式的实现原理及其应用场景。 #### 二、基础知识 1. **多...

    高并发多线程处理demo-java.rar

    8. **并发设计模式**:如生产者-消费者模式,其中生产者将任务放入队列,消费者从队列中取出并执行任务。这种模式在多线程并发编程中非常常见。 9. **异常处理**:在多线程环境中,正确处理异常是至关重要的,以...

    java_thread_demo

    另外,还有java.util.concurrent包下的BlockingQueue,它可以作为线程间的生产者-消费者模型,实现线程安全的数据交换。 此外,死锁、活锁和饥饿也是多线程编程中需要关注的问题。死锁是指两个或更多线程相互等待...

    Java 等待唤醒机制

    这个例子中,生产者和消费者线程共享一个标志`flag`,通过`wait()`和`notify()`控制生产与消费的交替进行。 了解并熟练掌握Java的等待唤醒机制对于编写高效的并发程序至关重要,它可以帮助我们解决多线程环境中的...

    JAVA多线程模式高清版+DEMO

    - 生产者-消费者模式:使用`BlockingQueue`实现线程间的生产与消费。 - 线程池模式:通过`ExecutorService`实现线程复用,避免频繁创建销毁线程。 - 单例模式在多线程环境下的应用:确保类只有一个实例,通常使用...

    Java多线程中不同条件下编写生产消费者模型方法介绍

    总结起来,Java中的生产者消费者模型是通过线程同步机制来协调生产者和消费者的活动,保证数据的一致性和正确性。在不同的场景下,可能需要调整模型以适应更多的生产者或消费者,或者改变缓冲区大小等条件,这需要对...

    hhg多线程编程2Demo

    - 可能包括了线程间的通信,如使用`wait()`、`notify()`和`notifyAll()`方法,或者使用`java.util.concurrent`包中的`BlockingQueue`实现生产者消费者模式。 - 可能涉及了线程安全的数据结构,如`ConcurrentHashMap`...

    线程同步demo

    这种方式常用于生产者-消费者问题或其他需要线程间协作的场景。 4. **Semaphore信号量**:信号量是一种更灵活的同步工具,它可以控制同时访问特定资源的线程数量。例如,如果一个资源只能被两个线程同时访问,可以...

    Java线程编程学习笔记(二)

    这些示例可能涵盖了各种场景,如生产者消费者模型、线程间的协作(通过信号量Semaphore)、线程优先级、守护线程(daemon threads)以及线程中断的处理。通过分析这些示例,我们可以更好地理解Java线程在实际开发中...

    《多线程开发实例代码》

    本压缩包提供了两个基本的多线程开发实例,涵盖了通过继承`Thread`类和实现`Runnable`接口来创建线程的方法。这两种方法都是Java中实现并发的基本途径,各有优缺点。 首先,我们来看`ThreadDemo`。这个例子展示了...

    ThreadDemo2

    在Java编程语言中,线程是程序执行...这种模式通常称为生产者-消费者模型,`input`线程作为生产者,`output`线程作为消费者,共享`RES`对象作为资源。通过有效的线程同步,避免了数据竞争问题,确保了程序的正确运行。

    j2ee中使用线程的小DEMO

    8. **线程通信**:Java提供了`BlockingQueue`等数据结构,用于实现线程间的通信,例如生产者消费者模型,使得线程能够协同工作,提高系统效率。 9. **异常处理**:在多线程环境下,正确处理异常至关重要,因为一个...

    android demo,locksuport的unpark一个线程。

    这种机制通常用于实现线程间的协作,比如在生产者消费者模型或者条件变量中。 `unpark(Thread thread)` 方法则是用来唤醒一个之前通过 `park()` 被阻塞的线程。当你调用 `unpark(thread)` 并传入一个线程对象时,...

    java多线程、锁的教程跟案例

    `demo.docx`可能包含各种多线程编程的示例,如生产者消费者模型、银行转账场景等。`API.docx`可能详细列出了相关类和方法的使用。`多线程.docx`可能是关于Java多线程的深入讲解,涵盖线程安全、线程同步、锁的使用等...

    多线程.rar

    3. **线程通信**:使用wait(), notify()和notifyAll()方法实现线程间的通信,例如生产者消费者问题。 4. **线程安全类**:如ArrayList不是线程安全的,而Vector和CopyOnWriteArrayList是线程安全的,比较它们在多...

    实战Java高并发程序设计-随书代码

    - **阻塞队列**:如`ArrayBlockingQueue`、`LinkedBlockingQueue`,在生产者消费者模型中的应用。 4. **并发工具类** - **CountDownLatch**:用于多线程间的协调,等待所有任务完成。 - **CyclicBarrier**:允许...

Global site tag (gtag.js) - Google Analytics