Java-Multithread-Produzent und -Konsumer

 1. Verwenden Sie hauptsächlich notifyAll und warten Sie, bis die Kommunikation zwischen Threads abgeschlossen ist

2. Vorsichtsmaßnahmen für die Verwendung von notifyAll und wait müssen in einem synchronen Codeblock verwendet werden, oder es kann sich um eine synchrone Methode handeln, und notifyAll und wait müssen für den Betrieb dasselbe Sperrobjekt verwenden. Wait kann nicht anhand von if beurteilt werden und muss anhand einer while-Schleife beurteilt werden um ein falsches Aufwachen zu verhindern

1. Erstellen Sie zunächst ein gemeinsames Lager, in dem Mobiltelefone aufbewahrt werden

import java.util.ArrayList;
import java.util.List;

public class Depository {
    private List<Phone> phoneList = new ArrayList();


    public List<Phone> getPhoneList() {

        return phoneList;
    }

    public void setPhoneList(List<Phone> phoneList) {
        this.phoneList = phoneList;
    }

    @Override
    public String toString() {
        return "PhoneDepository{" +
                "phoneList=" + phoneList +
                '}';
    }

    public class Phone{
        private String name;
        private float price;

        public Phone(String name, float price) {
            this.name = name;
            this.price = price;
        }

        @Override
        public String toString() {
            return "Phone{" +
                    "name='" + name + '\'' +
                    ", price='" + price + '\'' +
                    '}';
        }
    }
}

2. Erstellen Sie einen Produzenten

package com.yujie.pool.producer;

import com.yujie.pool.utils.Sleep;

import java.util.List;
import java.util.Random;


public class Producer implements Runnable{
    private Depository depository;

    public Producer(Depository depository) {
        if(depository == null){
            throw new NullPointerException("仓库不能为空");
        }
        this.depository = depository;
    }

    @Override
    public void run() {
        List<Depository.Phone> phoneList = depository.getPhoneList();
        while (true){
            synchronized (depository) {
                //这里不能用if防止虚假唤醒,如果有库存就等待
                while (phoneList.size() != 0){
                    try {
                        depository.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                Depository depository = new Depository();
                phoneList.add(depository.new Phone("小米5",new Random().nextInt(1888)));
                phoneList.add(depository.new Phone("苹果6",new Random().nextInt(1888)));
                for (Depository.Phone phone : phoneList) {
                    System.out.println("生产手机:"+phone);
                }
                System.out.println("生产手机,目前生产数量:" + phoneList.size());
                System.out.println("==============生产结束================");
                this.depository.notifyAll();

            }
        }
    }
}

3. Erstellen Sie einen Verbraucher

package com.yujie.pool.producer;

import com.yujie.pool.utils.Sleep;

import java.util.List;

public class Consumer implements Runnable {
    private Depository depository;

     Consumer(Depository depository) {
         if(depository == null){
             throw new NullPointerException("仓库不能为空");
         }
        this.depository = depository;
    }

    @Override
    public void run() {
        List<Depository.Phone> phoneList = depository.getPhoneList();
        while (true){
            synchronized (depository) {
                //这里不能用if防止虚假唤醒,如果没有库存就等待
                while (phoneList.size() == 0){
                    try {
                        depository.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                for (Depository.Phone phone : phoneList) {
                    System.out.println("卖出:"+phone);
                }
                System.out.println("------------卖出结束------------");
                this.depository.notifyAll();
                phoneList.clear();
            }
        }
    }
}

4. Testen


public class TestProducer {
    public static void main(String[] args) {
        Depository depository = new Depository();
        Producer producer = new Producer(depository);
        Consumer consumer = new Consumer(depository);

        new Thread(producer).start();
        new Thread(consumer).start();
    }
}
生产手机:Phone{name='小米5', price='774.0'}
生产手机:Phone{name='苹果6', price='1337.0'}
生产手机,目前生产数量:2
==============生产结束================
卖出:Phone{name='小米5', price='774.0'}
卖出:Phone{name='苹果6', price='1337.0'}
------------卖出结束------------
生产手机:Phone{name='小米5', price='1099.0'}
生产手机:Phone{name='苹果6', price='857.0'}
生产手机,目前生产数量:2
==============生产结束================
卖出:Phone{name='小米5', price='1099.0'}
卖出:Phone{name='苹果6', price='857.0'}
------------卖出结束------------
生产手机:Phone{name='小米5', price='515.0'}
生产手机:Phone{name='苹果6', price='255.0'}
生产手机,目前生产数量:2
==============生产结束================
卖出:Phone{name='小米5', price='515.0'}
卖出:Phone{name='苹果6', price='255.0'}
------------卖出结束------------

Supongo que te gusta

Origin blog.csdn.net/qq_42058998/article/details/128772217
Recomendado
Clasificación