面试:生产者消费者
发布日期:2021-05-07 02:59:48 浏览次数:23 分类:精选文章

本文共 7377 字,大约阅读时间需要 24 分钟。

面试:生产者消费者

(生产者消费者,思索,单例,八大排序)

传统版 sychronized wait notify

public class test {       public static void main(String[] args) {           A a =new A();        new Thread(()->{               for (int i = 0; i < 5; i++) {                   try {                       a.incr();                } catch (InterruptedException e) {                       e.printStackTrace();                }            }        },"Thread1+").start();        new Thread(()->{               for (int i = 0; i < 5; i++) {                   try {                       a.decr();                } catch (InterruptedException e) {                       e.printStackTrace();                }            }        },"thread-").start();        new Thread(()->{               for (int i = 0; i < 5; i++) {                   try {                       a.incr();                } catch (InterruptedException e) {                       e.printStackTrace();                }            }        },"Thread2+").start();        new Thread(()->{               for (int i = 0; i < 5; i++) {                   try {                       a.decr();                } catch (InterruptedException e) {                       e.printStackTrace();                }            }        },"thread2-").start();    }}class A{       int num = 0 ;    public synchronized void incr() throws InterruptedException {           while(num!=0){               this.wait();        }        this.num++;        System.out.println(Thread.currentThread().getName()+"执行完了+ 操作===》现在num值为:"+num);        this.notify();    }    public synchronized void decr() throws InterruptedException {           while(num==0){               this.wait();        }        this.num--;        System.out.println(Thread.currentThread().getName()+"执行完了- 操作===》现在num值为:"+num);        this.notify();    }}

结果:

Thread1+执行完了+ 操作===》现在num值为:1

thread2-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0

public class test {       public static void main(String[] args) {           A a =new A();        new Thread(()->{               for (int i = 0; i < 5; i++) {                   try {                       a.incr();                } catch (InterruptedException e) {                       e.printStackTrace();                }            }        },"Thread1+").start();        new Thread(()->{               for (int i = 0; i < 5; i++) {                   try {                       a.decr();                } catch (InterruptedException e) {                       e.printStackTrace();                }            }        },"thread-").start();        new Thread(()->{               for (int i = 0; i < 5; i++) {                   try {                       a.incr();                } catch (InterruptedException e) {                       e.printStackTrace();                }            }        },"Thread2+").start();        new Thread(()->{               for (int i = 0; i < 5; i++) {                   try {                       a.decr();                } catch (InterruptedException e) {                       e.printStackTrace();                }            }        },"thread2-").start();    }}class A{       int num = 0 ;    public synchronized void incr() throws InterruptedException {           if(num!=0){               this.wait();        }        this.num++;        System.out.println(Thread.currentThread().getName()+"执行完了+ 操作===》现在num值为:"+num);        this.notify();    }    public synchronized void decr() throws InterruptedException {           if(num==0){               this.wait();        }        this.num--;        System.out.println(Thread.currentThread().getName()+"执行完了- 操作===》现在num值为:"+num);        this.notify();    }}

结果:

Thread1+执行完了+ 操作===》现在num值为:1

thread2-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
thread2-执行完了- 操作===》现在num值为:-1
thread2-执行完了- 操作===》现在num值为:-2
thread2-执行完了- 操作===》现在num值为:-3
thread2-执行完了- 操作===》现在num值为:-4
Thread1+执行完了+ 操作===》现在num值为:-3

新版 lock await signal

class A{       int num = 0 ;    Lock lock=new ReentrantLock();    Condition condition = lock.newCondition();    public  void incr() throws InterruptedException {           lock.lock();//上锁        try {   //业务代码            while(num!=0){                   condition.await();            }            this.num++;            System.out.println(Thread.currentThread().getName()+"执行完了+ 操作===》现在num值为:"+num);            condition.signal();        } catch (Exception e) {               e.printStackTrace();        }finally {               lock.unlock();        }    }    public  void decr() throws InterruptedException {           lock.lock();        try {               while(num==0){                   condition.await();            }            this.num--;            System.out.println(Thread.currentThread().getName()+"执行完了- 操作===》现在num值为:"+num);            condition.signal();        } catch (Exception e) {               e.printStackTrace();        }finally {               lock.unlock();        }    }}

Thread1+执行完了+ 操作===》现在num值为:1

thread1-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread1-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread1-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread1-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread1-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0

Condition可以实现精准的唤醒

例如循环的 唤醒 等等

class A{       int num = 0 ;    Lock lock=new ReentrantLock();    Condition condition1 = lock.newCondition();    Condition condition2 = lock.newCondition();    public  void incr() throws InterruptedException {           lock.lock();//上锁        try {   //业务代码            while(num!=0){                   condition1.await();            }            this.num++;            System.out.println(Thread.currentThread().getName()+"执行完了+ 操作===》现在num值为:"+num);            condition2.signal();        } catch (Exception e) {               e.printStackTrace();        }finally {               lock.unlock();        }    }    public  void decr() throws InterruptedException {           lock.lock();        try {               while(num==0){                   condition2.await();            }            this.num--;            System.out.println(Thread.currentThread().getName()+"执行完了- 操作===》现在num值为:"+num);            condition1.signal();        } catch (Exception e) {               e.printStackTrace();        }finally {               lock.unlock();        }    }
上一篇:零钱兑换--动态规划
下一篇:docker命令学习(一)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年04月03日 22时11分33秒