并发编程语言

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

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

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

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

当另一个线程执行一个对象的notify方法时,它会唤醒这个对象的等待池中的一个线程,使它成为一个可运行的线程。notifyAll方法将唤醒所有等待该对象的线程,并使其成为可运行的线程。

我们来看一个经典问题:生产者和消费者的问题。通过灵活使用wati、notify和notifyAll方法来实现这个问题的解决。

任务要求如下:

把生产者的产品交给商店,消费者从商店取走产品。商店一次只能存储固定数量的产品。如果生产商生产的产品太多,商店会要求生产商等待。如果店内有空店,则通知生产商继续生产;如果店里没有产品,店家会告诉消费者等一下,如果店里有产品,会通知消费者去取。

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

定义产品类,产品包含一个产品标识的id属性。另外,要在生产或消费过程中打印产品的详细信息,重写toString方法,产品类的代码如下:

定义商店类。商店一次只能容纳10种产品。如果生产者生产超过10个产品,它将使当前在这个对象上操作的线程等待。当一个线程访问addProduct方法时,它已经得到了这个锁,当遇到10个以上的产品时就会阻塞。如果不超过10份,继续生产产品,调用notify方法唤醒一个等待当前对象的线程。请注意,通知和等待通常是一一对应的。代码如下:

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

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

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

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

■知识推动

案例中有两个线程类,即生产者类和消费者类。商店阶层负责产品的购买和销售,因此商店阶层需要协调生产者阶层和消费者阶层。当生产者类生产的产品过多时,商店类需要调用wait方法停止生产者类的生产,调用notify方法通知消费者取走产品。反之,当没有产品可用时,Shop类需要调用wait方法让Consumer类等待产品,调用notify方法通知生产者继续生产产品。

 
友情链接
鄂ICP备19019357号-22