zoukankan      html  css  js  c++  java
  • Java如何使用线程解决生产者消费者问题?

    在Java编程中,如何使用线程解决生产者消费者问题?

    以下示例演示如何使用线程解决生产者消费者问题。

    package com.yiibai;
    
    public class ProducerConsumerProblem {
        public static void main(String[] args) {
            CubbyHole c = new CubbyHole();
            Producer p1 = new Producer(c, 1);
            Consumer c1 = new Consumer(c, 1);
            p1.start();
            c1.start();
        }
    }
    
    class CubbyHole {
        private int contents;
        private boolean available = false;
    
        public synchronized int get() {
            while (available == false) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }
            available = false;
            notifyAll();
            return contents;
        }
    
        public synchronized void put(int value) {
            while (available == true) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }
            contents = value;
            available = true;
            notifyAll();
        }
    }
    
    class Consumer extends Thread {
        private CubbyHole cubbyhole;
        private int number;
    
        public Consumer(CubbyHole c, int number) {
            cubbyhole = c;
            this.number = number;
        }
    
        public void run() {
            int value = 0;
            for (int i = 0; i < 10; i++) {
                value = cubbyhole.get();
                System.out.println("Consumer #" + this.number + " get: " + value);
            }
        }
    }
    
    class Producer extends Thread {
        private CubbyHole cubbyhole;
        private int number;
    
        public Producer(CubbyHole c, int number) {
            cubbyhole = c;
            this.number = number;
        }
    
        public void run() {
            for (int i = 0; i < 10; i++) {
                cubbyhole.put(i);
                System.out.println("Producer #" + this.number + " put: " + i);
                try {
                    sleep((int) (Math.random() * 100));
                } catch (InterruptedException e) {
                }
            }
        }
    }
    
    Java

    上述代码示例将产生以下结果 -

    Producer #1 put: 0
    Consumer #1 get: 0
    Producer #1 put: 1
    Consumer #1 get: 1
    Producer #1 put: 2
    Consumer #1 get: 2
    Producer #1 put: 3
    Consumer #1 get: 3
    Producer #1 put: 4
    Consumer #1 get: 4
    Consumer #1 get: 5
    Producer #1 put: 5
    Producer #1 put: 6
    Consumer #1 get: 6
    Producer #1 put: 7
    Consumer #1 get: 7
    Producer #1 put: 8
    Consumer #1 get: 8
    Producer #1 put: 9
    Consumer #1 get: 9
  • 相关阅读:
    基于ESFramework的P2P实现 —— ESFramework扩展之EsfP2P
    反射中使用 BindingFlags.IgnoreCase
    DTS开发记录(8)-- 主键的影响
    双向链表
    const_iterator和const iterator的区别
    顺序队列
    谈一谈网络编程学习经验
    使用模板元编程快速的得到斐波那契数。。
    数组的选择固定大小数组模板array存在的意义!
    C++查缺补漏2,赶紧的
  • 原文地址:https://www.cnblogs.com/borter/p/9613443.html
Copyright © 2011-2022 走看看