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
  • 相关阅读:
    接水果(fruit)
    大融合
    排序(sortb)
    latex公式测试
    次小生成树
    HDU 2973 YAPTCHA (威尔逊定理)
    状压DP概念 及例题(洛谷 P1896 互不侵犯)
    ICPC Asia Nanning 2017 F. The Chosen One (大数、规律、2的k次幂)
    HDU 1074 Doing Homework (状压DP)
    最长上升(不下降)子序列(LIS) 不同求解方法(动规、贪心)
  • 原文地址:https://www.cnblogs.com/borter/p/9613443.html
Copyright © 2011-2022 走看看