Skip to content

BlockingQueue生产者消费者代码实现

题目:编写一段生产者/消费者的 Java 代码,其中生产者每次生产 1 个 0 到 1000 之间的随机数,消费者则把该随机数打印出来。如果产生的随机数为 0,则生产者、消费者均退出运行。要求生产者、消费者均使用线程来实现。

java
//方法一:
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class ThreadTest {
    public static void main(String[] args) {
        Storage storage = new Storage();
        new Producer(storage).start();
        new Customer(storage).start();

    }

}

class Customer extends Thread {

    private Storage storage;

    public Customer(Storage storage) {
        this.storage = storage;
    }

    public void run() {
        while (true) {
            try {
                if (Storage.NUM == 0) {
                    System.out.println("打印:" + 0 + ",线程终止");
                    break;
                }
                Integer num = storage.print();
                System.out.println("打印:" + num);
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Producer extends Thread {

    private Storage storage;

    public Producer(Storage storage) {
        this.storage = storage;
    }

    public void run() {

        while (true) {

            try {
                Integer num = new Random().nextInt(1000);
                Storage.NUM = num;
                if (Storage.NUM == 0) {
                    System.out.println("生产:" + 0 + ",线程终止");
                    break;
                }
                storage.put(num);
                System.out.println("生产:" + num);
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

    }
}

class Storage {
    private BlockingQueue<Integer> randomData = new ArrayBlockingQueue<Integer>(
            1);// 空间大小为1的阻塞队列

    public static int NUM = -1;

    public void put(Integer number) {

        try {
            randomData.put(number);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public int print() {
        try {
            Integer number = randomData.take();
            return number;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return 0;
    }
}


//方法二:
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;

public class Test {

    BlockingQueue<Integer> queue = new SynchronousQueue<Integer>();

    Random rd = new Random();

    class Producer extends Thread {
        @Override
        public void run() {
            while (true) {
                int number = rd.nextInt(1000);
                System.out.println("Producer Generate : " + number);
                try {
                    queue.put(number);
                    if (number == 0) {
                        System.out.println("Producer stoped.");
                        return;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }

    }

    class Consumer extends Thread {
        @Override
        public void run() {
            while (true) {
                try {
                    if (queue.take() == 0) {
                        System.out.println("Consumer stoped.");
                        return;
                    }
                    ;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void startTest() {
        Producer producer = new Producer();
        Consumer consumer = new Consumer();
        producer.start();
        consumer.start();
    }

    public static void main(String[] args) {
        new Test().startTest();
    }
}


//方法三:
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

public class BlockingQueueTest {
    private static String FLAG="99";

    public static class Basket {
        // 篮子,能够容纳1000个数字
        BlockingQueue<String> basket = new LinkedBlockingQueue<String>(1000);

        // 生产数字,放入篮子
        public String produce() throws InterruptedException {
            int num = new Random().nextInt(1000);
            System.out.println("++放入篮子中一个数字:"+num );
            basket.put(num+"");
            return num+"";
        }

        // 消费数字,从篮子中取走
        public String consume() throws InterruptedException {
            String num=basket.take();
            System.out.println("--取出篮子中一个数字:"+num );
            return num;
        }

    }


    //  测试方法
    public static void testBasket() {
        final Basket basket = new Basket();
        // 定义生产者
        class Producer implements Runnable {
            public void run() {
                try {
                    while (true) {
                        if(basket.produce().equals(FLAG)){
                            System.out.println("!成功生产正确数字:"+FLAG);
                            break;
                        }
                        // 休眠300ms
                        Thread.sleep(300);
                    }
                } catch (InterruptedException ex) {
                }
            }
        }

        // 定义数字消费者
        class Consumer implements Runnable {
            public void run() {
                try {
                    while (true) {
                        // 消费数字
                        // 休眠1000ms
                        if(basket.consume().equals(FLAG)){
                            System.out.println("!成功获取正确数字:"+FLAG);
                            break;
                        }
                        Thread.sleep(500);
                    }
                } catch (InterruptedException ex) {
                }
            }
        }

        ExecutorService service = Executors.newCachedThreadPool();
        Producer producer = new Producer();
        Consumer consumer = new Consumer();
        service.submit(producer);
        service.submit(consumer);

        // 程序运行60s后,所有任务停止
        try {
            Thread.sleep(60*1000);
        } catch (InterruptedException e) {
        }


        service.shutdownNow();
    }

    public static void main(String[] args) {
        BlockingQueueTest.testBasket();
    }
}
}
最近更新