• 经典javaThead 生产者 消费者


    在网找的一个代码,经过修改后,我认为更有代表性。因为这个代码到处都是,所以我不知道谁是原创,也就不好标明出处了。希望原作者见谅!

     1 class MainThread {
     2     public static void main(String[] args) {
     3         Queue queue = new Queue();
     4         Producer producer = new Producer(queue);
     5         Consumer consumer = new Consumer(queue);
     6         new Thread(producer).start();
     7         new Thread(consumer).start();
     8     }
     9 }
    10 
    11 /* 注意:wait notify notifyAll只能在同步方法或内步块中调用 */
    12 class Queue {
    13     int product = 0;
    14 
    15     public synchronized void setProduct() {
    16         if (this.product > 10) {// 如果队列已满,则调用wait等待消费者取走产品
    17             try {
    18                 wait();
    19             } catch (Exception e) {
    20                 e.printStackTrace();
    21             }
    22         }
    23         this.product++/* 开始放置产品到队列中 */
    24         System.out.println("Product, product left:" + product);
    25         notify();// 生产产品后通知消费者取走产品
    26         try {
    27             Thread.sleep(20);
    28         } catch (InterruptedException e) {
    29             // TODO Auto-generated catch block
    30             e.printStackTrace();
    31         }
    32     }
    33 
    34     public synchronized void getProduct() {
    35         if (this.product <= 0) {// 如果队列是空的,则调用wait等待生产者生产产品
    36             try {
    37                 wait();
    38             } catch (Exception e) {
    39                 e.printStackTrace();
    40             }
    41         }
    42         /* 开始从队列取走产品 */
    43         this.product--;
    44         System.out.println("Consume, product left:" + product);
    45         notify();// 取走产品后通知生产者继续生产产品
    46         try {
    47             Thread.sleep(20);
    48         } catch (InterruptedException e) {
    49             // TODO Auto-generated catch block
    50             e.printStackTrace();
    51         }
    52     }
    53 }
    54 
    55 class Producer implements Runnable {
    56     Queue queue;
    57 
    58     Producer(Queue queue) {
    59         this.queue = queue;
    60     }
    61 
    62     public void run() {// 生产线程
    63         for (int i = 1; i <= 10; i++) {
    64             queue.setProduct();
    65         }
    66     }
    67 }
    68 
    69 class Consumer implements Runnable {
    70     Queue queue;
    71 
    72     Consumer(Queue queue) {
    73         this.queue = queue;
    74     }
    75 
    76     public void run() {// 消费线程
    77         for (int i = 1; i <= 10; i++) {
    78             queue.getProduct();
    79         }

    80     }

    81 } 


     

  • 相关阅读:
    Java XML的总结(一)
    golang两个协程交替打印1-100的奇数偶数
    nat类型探测方法(排除法)
    janus-gateway 在macOS上的编译部署
    性能测试-并发和QPS
    基于etcd的Rabbitmq队列订阅负载均衡
    【python学习笔记】10.充电时刻
    【python学习笔记】9.魔法方法、属性和迭代器
    【python学习笔记】8.异常
    【python学习笔记】7.更加抽象
  • 原文地址:https://www.cnblogs.com/zhonghan/p/1442373.html
Copyright © 2020-2023  润新知