マルチスレッドの注意事項 - 生産者と消費者

消費者


import java.util.Queue;

public class Customer implements Runnable {

    /**
     * 数据队列
     */
    private Queue<String> queue ;


    public Customer(Queue<String> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while(true){
            synchronized (queue){
                while(queue.isEmpty()){
                    System.out.println("数据队列为空,请生产者生产数据");
                    try {

                        queue.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                String data = queue.remove() ;

                System.out.println("当前取出的数据为:"+data);

                //唤醒生产者
                queue.notify();
            }
        }
    }
}

プロデューサー


import java.util.Queue;

public class Producer implements Runnable {

    private Queue<String> queue ;

    private int maxSize ;

    public Producer(Queue<String> queue, int maxSize) {
        this.queue = queue;
        this.maxSize = maxSize;
    }

    @Override
    public void run() {
        int num = 0 ;
        while (true){
            num ++ ;
            synchronized (queue){
                while(queue.size() == maxSize){
                    System.out.println("数据队列已满,请消费者读取数据");
                    try {
                        //Producer阻塞,并释放同步锁
                        //如果消费了,则size != maxSize ;
                        //则继续生产数据
                        queue.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                queue.add("数据"+num) ;

                System.out.println("生产数据:数据"+num);
                //唤醒阻塞的消费者
                queue.notify();
            }
        }
    }
}

テスト


import java.util.LinkedList;
import java.util.Queue;

public class CustomerProducerDemo {

    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>() ;

        Producer producer = new Producer(queue , 10) ;

        Customer customer = new Customer(queue) ;

        Thread t1 = new Thread(producer) ;
        Thread t2 = new Thread(customer) ;

        t1.start() ;
        t2.start() ;
    }
}

公開された56元の記事 ウォンの賞賛3 ビュー1172

おすすめ

転載: blog.csdn.net/qq_40788718/article/details/103649829