千家信息网

如何使用Lock和Condition来实现生产者消费者

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,今天就跟大家聊聊有关如何使用Lock和Condition来实现生产者消费者,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。对比两种方式,Cond
千家信息网最后更新 2025年02月01日如何使用Lock和Condition来实现生产者消费者

今天就跟大家聊聊有关如何使用Lock和Condition来实现生产者消费者,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

对比两种方式,Condition的方式可以更加精确的指定哪些线程被唤醒。

public class MyContainer2 {        final private LinkedList lists = new LinkedList<>();        final private int MAX = 10; //最多10个元素        private int count = 0;                private Lock lock = new ReentrantLock();        //生产者的条件        private Condition producer = lock.newCondition();        //消费者的条件        private Condition consumer = lock.newCondition();                public void put(T t) {                try {                        lock.lock();                        while(lists.size() == MAX) { //想想为什么用while而不是用if?                                producer.await();                        }                                                lists.add(t);                        ++count;                        consumer.signalAll(); //通知消费者线程进行消费                } catch (InterruptedException e) {                        e.printStackTrace();                } finally {                        lock.unlock();                }        }                public T get() {                T t = null;                try {                        lock.lock();                        while(lists.size() == 0) {                                consumer.await();                        }                        t = lists.removeFirst();                        count --;                        producer.signalAll(); //通知生产者进行生产                } catch (InterruptedException e) {                        e.printStackTrace();                } finally {                        lock.unlock();                }                return t;        }                public static void main(String[] args) {                MyContainer2 c = new MyContainer2<>();                //启动消费者线程                for(int i=0; i<10; i++) {                        new Thread(()->{                                for(int j=0; j<5; j++) System.out.println(c.get());                        }, "c" + i).start();                }                                try {                        TimeUnit.SECONDS.sleep(2);                } catch (InterruptedException e) {                        e.printStackTrace();                }                                //启动生产者线程                for(int i=0; i<2; i++) {                        new Thread(()->{                                for(int j=0; j<25; j++) c.put(Thread.currentThread().getName() + " " + j);                        }, "p" + i).start();                }        }}

看完上述内容,你们对如何使用Lock和Condition来实现生产者消费者有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

0