多线程----生产者消费者

来源:互联网 发布:交友约会软件 编辑:程序博客网 时间:2024/06/07 15:28
// 生产者class Factory {    private List<Integer> array;    private int index = 1;    public Factory(List<Integer> array) {        this.array = array;    }    public void create() {        new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    synchronized (array) {                        try {                            Thread.sleep(200);                            if (array.size() == 1) {                                array.wait();                            } else {                                array.add(index);                                System.out.println(Thread.currentThread().getId() + "--生产:" + index);                                index++;                                array.notify();                            }                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                }            }        }).start();    }}// 消费者class Customer {    private List<Integer> array;    public Customer(List<Integer> array) {        this.array = array;    }    public void get() {        new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    synchronized (array) {                        try {                            Thread.sleep(200);                            if (array.size() == 0) {                                array.wait();                            } else {                                System.out.println(Thread.currentThread().getId() + "--获取:" + array.get(0));                                array.remove(0);                                array.notify();                            }                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                }            }        }).start();    }}public static void main(String[] args) {        List<Integer> list = new ArrayList<>();        Factory factory = new Factory(list);        Customer customer = new Customer(list);        factory.create();        customer.get();}

会出现成产一个,消费一个交替运行的情况。当调用方法改成了:

public static void main(String[] args) {        List<Integer> list = new ArrayList<>();        Factory factory = new Factory(list);        Customer customer = new Customer(list);        for (int i = 0; i < 5; i++) {            factory.create();            customer.get();        }}

则有可能运行一段时间就出现假死的情况,解决办法:将notify方法换成notifyAll

0 0
原创粉丝点击