生产消费线程安全

package org.example;

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class ConsumerProducer {
    public static void main(String[] args) {
        Resource resource = new Resource();

        //生产者
        ProducerThread p = new ProducerThread(resource);
        //消费者
        ConsumerThread c = new ConsumerThread(resource);

        p.start();
        c.start();

    }

    static class ConsumerThread extends Thread {
        private final Resource resource;

        public ConsumerThread(Resource resource) {
            this.resource = resource;
            //setName("消费者");
        }

        public void run() {
            while (true) {
                try {
                    Thread.sleep((long) (1000 * Math.random()));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                resource.remove();
            }
        }
    }

    static class ProducerThread extends Thread {
        private final Resource resource;

        public ProducerThread(Resource resource) {
            this.resource = resource;
//            setName("生产者");
        }

        public void run() {
            while (true) {
                try {
                    Thread.sleep((long) (1000 * Math.random()));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                resource.add();
            }
        }
    }

    static class Resource {
        private final BlockingQueue resourceQueue = new LinkedBlockingQueue<>(100);


        public void add() {
            try {
                int ret = new Random().nextInt(10000);
                resourceQueue.put(ret );
                System.out.println("生产者:" + Thread.currentThread().getName()+ "生产:"+ret  + ",剩余:" + resourceQueue.size() );
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


        public void remove() {
            try {
                Integer take = resourceQueue.take();
                System.out.println("消费者:" + Thread.currentThread().getName() +",消耗:"+take + ",剩余:" + resourceQueue.size());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

你可能感兴趣的:(java,中间件,开发语言)