• 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
  • 相关阅读:
    VS停止调试,IIS Express也跟着关闭了
    会钓鱼的程序员
    彻底搞懂https原理
    Java小知识
    ORA-01000: 超出打开游标的最大数(java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误)
    虚拟机电脑重启后连接不上ORACLE
    电视直播源
    国内开源镜像站
    分享一波泰勒斯威夫特手机高清壁纸
    阿里云网盘内测申请
  • 原文地址:https://www.cnblogs.com/borter/p/9613443.html
Copyright © 2020-2023  润新知