`
shuiguaiQQ
  • 浏览: 14536 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

java wait()和notify()(生产者和消费者问题)

    博客分类:
  • Java
阅读更多

转载请注明出处:http://shuiguaiqq.iteye.com/blog/2065452

以前一直都是看看,似懂非懂,今天就手写了下,加深理解。

整个问题(是一个多线程同步问题的经典案例)简单来说就是说有一个仓库,里面有很多产品,生产者负责往里塞产品,但产品到达8个时不能再往里塞,等到小于8个时再继续,消费者负责往外拿产品,只要仓库里有产品就一直拿直到仓库产品一个都没就停下,等到有产品再继续。

好了,话糙理不糙,看代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Test {
    public static void main(String[] args) {
        Stoarge stoarge = new Stoarge();

        new Thread(new Producer(stoarge)).start();
        new Thread(new Producer(stoarge)).start();
        new Thread(new Customer(stoarge)).start();
    }
}

class Product {
    private int code;

    public Product(int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    @Override
    public String toString() {

        return "Pdt(" + code + ")";
    }

}

class Producer implements Runnable {
    private Stoarge stoarge;

    public Producer(Stoarge stoarge) {
        this.stoarge = stoarge;
    }

    @Override
    public void run() {
        while (true) {
            stoarge.proOne();
        }

    }

}

class Customer implements Runnable {
    private Stoarge stoarge;

    public Customer(Stoarge stoarge) {
        this.stoarge = stoarge;
    }

    @Override
    public void run() {
        while (true) {
            stoarge.cusOne();
        }

    }

}

class Stoarge {
    static final int MAX_NUMBER = 8;
    static Random random = new Random();
    private List<Product> products = new ArrayList<Product>();

    public List<Product> getProducts() {
        return products;
    }

    public void setProducts(List<Product> products) {
        this.products = products;
    }

    public synchronized Product cusOne() {
        while (products.size() <= 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        Product p = products.get(products.size() - 1);
        products.remove(products.size() - 1);
        notify();

        System.out.print(" Stoarge All("+products.size()+"):");
        display();
        System.out.println("------------此次消费:" + p);
        return p;
    }

    public synchronized void proOne() {
        while (products.size() >= Stoarge.MAX_NUMBER) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        Product p = new Product(Stoarge.random.nextInt(20) + 1);
        products.add(p);
        notify();

        System.out.print(" Stoarge All("+products.size()+"):");
        display();
        System.out.println("------------此次生产:" + p);
    }

    private void display() {
        String str = "";
        for (Product p : products) {
            str += p.toString() + "_";
        }
        if (products.size() > 0) {
            System.out.print(str.substring(0, str.length() - 1));
        }

    }

}

 

1
0
分享到:
评论

相关推荐

    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 生产者消费者

    在`main.java`文件中,我们可以预期看到具体的生产者和消费者线程类,以及它们如何使用`wait()`和`notify()`方法进行交互。`README.txt`可能是对代码的简单解释或使用指南。 了解并掌握生产者消费者模型和`wait-...

    wait_notify_demo

    总结来说,Java的`wait()`、`notify()`和`notifyAll()`方法是实现多线程间协作的关键工具,特别是对于解决生产者消费者问题。理解它们的工作原理和正确使用方式对于编写高效的并发代码至关重要。在上述示例中,我们...

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

    生产者和消费者线程都需要有自己的业务逻辑,这可以通过重写`run()`方法实现。 2. **共享资源**:在生产者-消费者模型中,通常会有一个固定大小的缓冲区作为共享资源。可以使用数组或链表实现,但需要注意的是,当...

    java生产者消费者问题

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

    如何在Java中正确使用 wait, notify 和 notifyAll

    举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待消费(不为空)。相应的,消费者可以通知生产者可以开始生成更多的数据,...

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

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

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

    通过这样的设计,我们可以有效地控制生产者和消费者的执行顺序,确保了数据的正确性,并且避免了先消费后生产的情况。在实际应用中,可能需要根据具体需求进行优化,例如添加异常处理、使用更高级的同步工具(如`...

    java生产者消费者

    在这个例子中,我们使用一个LinkedList作为共享的缓冲区,生产者和消费者共享对这个队列的访问,并通过wait/notify进行同步。当队列满时,生产者会被阻塞;当队列空时,消费者会被阻塞。当队列状态改变时,使用...

    Java的sychronized、wait和notify范例

    在实际开发中,`wait()`、`notify()`和`synchronized`常常用于实现生产者消费者模型、读写锁等高级并发场景。通过理解并熟练掌握这些概念,开发者可以编写出更加高效、可靠的多线程程序。 在提供的压缩包文件`java_...

    生产者与消费者 java实现

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

    操作系统生产者与消费者问题Java简单模拟实现

    此外,`wait()`和`notify()`方法可能被用来在生产者和消费者之间进行更精细的控制。当生产者发现队列已满,它会调用`wait()`,将自身置于等待状态,同时释放锁。消费者取走元素后,如果发现队列为空,也会调用`wait...

    java生产者与消费者实验报告

    - **缓冲区/队列**:作为生产者和消费者之间的共享资源,用于存储临时数据。 为了保证数据的一致性和线程安全,通常采用锁和条件变量来控制对缓冲区的访问,避免数据竞争和死锁现象。在Java中,`synchronized`...

    Java生产者与消费者

    例如,我们可以使用`ArrayBlockingQueue`作为缓冲区,生产者和消费者线程分别调用`offer()`和`take()`方法。这种方式相比于原始的`synchronized`和`wait/notify`方法,更易于理解和使用,同时也具有更好的性能。

    java 实现操作系统的消费者生产者问题

    该问题涉及两个类型的角色:生产者和消费者。生产者负责将数据放入共享缓冲区,而消费者则从缓冲区取出数据。为了确保数据的一致性和完整性,避免出现竞态条件(race condition),需要在生产者和消费者之间进行同步...

    java生产者与消费者问题

    除了`BlockingQueue`,Java还提供了其他同步工具,如`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法,以及`ReentrantLock`、`Condition`等,它们都可以用来解决生产者消费者问题,但`BlockingQueue...

    生产者消费者问题 Java实现

    生产者消费者问题是多线程编程中的经典模型,用于展示如何在并发环境中协调生产者和消费者之间的数据处理。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。Java语言提供了丰富的工具来解决...

    java模拟生产者和消费者问题

    代码中包含了多个按钮(代表生产者和消费者),以及文本字段用于显示队列状态。尽管代码未完整展示逻辑部分,但可以看出其意图是通过按钮点击事件来模拟生产者生产数据和消费者消费数据的过程,从而可视化地演示阻塞...

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

    在Java中,我们可以利用同步机制来实现这种关系,确保生产者和消费者之间正确、有序地交互。 首先,理解生产者消费者模型的核心概念。生产者将产品放入一个共享的缓冲区,而消费者从缓冲区取出产品进行消费。关键...

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

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

Global site tag (gtag.js) - Google Analytics