java 并发编程实例_Java并发编程案例解读

经过前面几节的学习,了解了多线程概念、Thread类的应用、多线程数据同步存在的问题及解决方法。本节给出一个并发编程实例应用案例,通过案例的学习,可以灵活地把多线程知识应用到实际编程中,解决在项目开发过程中遇到的并发编程问题。

在进入案例之前,先了解一下实现Java同步机制的几个方法,Java.lang.object类提供了wati()、notify()、notifyAll()方法,它们与synchronized关键字结合使用,可以建立很多优秀的同步模型。

当synchronized修饰的方法或代码块中的wati()方法被调用时,当前线程将被中断运行,并且放弃该对象的锁。

当另外的线程执行了某个对象的notify()方法后,会唤醒在此对象等待池中的某个线程,使之成为可运行的线程。notifyAll()方法会唤醒所有等待这个对象的线程,使之成为可运行的线程。

下面来看一个比较经典的问题:生产者(Producer)和消费者(Consumer)问题。这个问题的解决就是通过灵活使用wati()、notify()、notifyAll()方法来实现的。

任务要求如下:

生产者将产品交给店铺,消费者从店铺取走产品,店铺一次只能存储固定数量的产品,如果生产者生产了过多产品,店铺会让生产者等一下,如果店中有空间存储产品了,再通知生产者继续生产;如果店中没有产品了,店铺会告诉消费者等一下,如果店中有产品了,再通知消费者来取走产品。

要实现上述任务要求,我们需要定义一个生产者线程类和消费者线程类。再建立一个全局数组作为存储产品的缓冲区。其控制过程是,生产者向缓冲区存入产品,消费者从缓冲区取走产品。当缓冲区满时,生产者必须阻塞,等待消费者取走产品后将其唤醒。当缓冲区空时,消费者被阻塞,等待生产者生产了产品后将其唤醒。

(1)定义产品类,产品包含一个产品标识的id属性。另外要在生产或消费时打印产品的详细内容,因此重写toString()方法,产品类的代码如下所示:

3da170e65431a60739af99e4be379ee2.png

(2)定义店铺类,店铺一次只能持有10份产品,如果生产者生产的产品多余10分,则会让当前正在此对象上操作的线程等待。一个线程访问addProduct方法时,它已经拿到这个锁了,当遇到产品大于10份时,它会阻塞。如果没有大于10份,则继续生产产品,并且调用notify方法,叫醒一个正在当前这个对象上等待的线程。这里请注意,notify和wait一般是一一对应的。代码如下所示:

56b636ec35c4bba23301ae017cd5d845.png

(3)定义生产者线程类,生产者负责生产产品,每生产完一个产品,调用Thread类的sleep方法休眠一段时间,模拟生产过程。代码如下:

02c13a235f4869553c44c14529ab0b2e.png

(4)定义消费者线程类,消费者负责消费产品,消费者每消费完一个产品,调用Thread类的sleep方法休眠一段时间,模拟消费过程。代码如下:

aad407af81fab22aba3690145fd4d629.png

(5)定义主线程类。代码如下:

ba0ed24222315c3d0a8ff920477f9a5f.png

主线程类首先实例化Shop对象,然后分别实例化生产者线程和消费者线程。程序输出结果如下图所示:

24f3710b3e3734a0840a70d031d2e79e.png

■ 知识点拨

案例有两个线程类,分别是Producer类(生产者)和Consumer类(消费者),Shop类(店铺)负责产品的购进(存储产品的数量有限)与销售,因此Shop类需要协调Producer类和Consumer类,当Producer类生产过多产品时,Shop类需要调用wait方法让Producer类不要再继续生产,同时调用notify方法通知消费者来取走产品(如果有正在等待产品的消费者)。反之亦然,当无产品可取时,Shop类需要调用wait方法让Consumer类等待产品,同时调用notify方法通知生产者继续生产产品。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值