• 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
  • 相关阅读:
    SRM 551 div2
    HDU_4390 Number Sequence (容斥原理)
    HDU 多校联合第五场
    HDU 多校联合第六场
    POJ 2057 The Lost House (经典树形dp)
    Lucas定理
    HDU 4385 Moving Bricks (状态dp+贪心)
    HDU 多校联合第三场
    当最短路变成二维 _!
    POJ 1848 (一道不错的树形dp)
  • 原文地址:https://www.cnblogs.com/borter/p/9613443.html
Copyright © 2020-2023  润新知