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
  • 相关阅读:
    hdu1180奇怪的楼梯……bfs迷阵……wa该16二级,我太渣滓
    Android新闻案例clientserver达到,完全自己的新闻节目平台
    xcode代码统计行
    linux每个路由表的系统研究
    Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)
    《网络编程》ioctl 操作
    Android framework召回(3)binder使用和IBinder BpRefbase IInterface INTERFACE 之间的关系
    使用关节型
    leetcode 218: The Skyline Problem
    删除依赖命令
  • 原文地址:https://www.cnblogs.com/borter/p/9613443.html
Copyright © 2011-2022 走看看