
面试:生产者消费者
发布日期: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值为:0public 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值为:0Condition可以实现精准的唤醒
例如循环的 唤醒 等等
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(); } }
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月03日 22时11分33秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
《带你装B,带你飞》pytest成魔之路4 - fixture 之大解剖
2021-05-09
互联网App应用程序测试流程及测试总结
2021-05-09
根据轨迹分析出用户家在哪
2021-05-09
PostgreSQL查询表名称及表结构
2021-05-09
linux中使用awk命令
2021-05-09
如何使用google搜索?
2021-05-09
Redis分布式锁的正确实现方式
2021-05-09
设计模式-抽象工厂模式
2021-05-09
IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
2021-05-09
IDEA 调试Java代码的两个技巧
2021-05-09
Vue 数组和对象更新,但视图未更新,背后的故事
2021-05-09
剑指Offer面试题:9.二进制中1的个数
2021-05-09
《你是在做牛做马还是在做主管》- 读书笔记
2021-05-09
重新温习软件设计之路(4)
2021-05-09
MySQL数据库与python交互
2021-05-09
python如何对字符串进行html转义与反转义?
2021-05-09
开发小白也毫无压力的hexo静态博客建站全攻略 - 躺坑后亲诉心路历程
2021-05-09