理论教育 Java程序设计:区别解析

Java程序设计:区别解析

时间:2023-10-18 理论教育 版权反馈
【摘要】:图12.6程序运行结果从图12.6的运行结果可以看出,剩余票数并不是依次递减的,3个售票窗口总共会卖出30张车票,每张票都会被每个窗口卖一次。图12.8程序运行结果从图12.8的运行结果可以看出,3个售票窗口将共同销售10张车票,即三个线程共享公共资源,如图12.9所示。

Java程序设计:区别解析

在上面两节讲述了直接继承Thread类和实现Runnable接口两种实现多线程的方法,一般情况下开发人员都会选择实现Runnable接口,其主要原因有以下两点:

(1)实现Runnable接口方式可以避免由于Java单继承特性带来的局限性。

(2)直接继承Thread类的方式不适合处理共享资源(如多个售票窗口共享所有的车票)。

下面我们通过多个窗口售票的实例来看看不同的线程实现方式对于处理共享资源的区别。

【例12.3】假设售票厅开设有3个售票窗口(需要创建3个线程),让这些售票窗口共同售卖10张车票,请采用多线程实现这个过程,并将售票过程输出至控制台

1.采用直接继承Thread类的方式

在Chapter12这个项目下创建一个名为cn.pzhu.ticket的包,并在这个包下创建一个名为MyThread的类,在这个类中覆写run()方法实现售票操作,关键代码如下:

在cn.pzhu.ticket的包下创建一个名为Example03的类,在这个类中创建三个线程来模拟三个售票窗口进行售票,关键代码如下:

运行结果如图12.6所示。

图12.6 程序运行结果

从图12.6的运行结果可以看出,剩余票数并不是依次递减的,3个售票窗口总共会卖出30张车票,每张票都会被每个窗口卖一次。这是因为在程序中创建的3个售票线程并不会共享数据,每个线程都将拥有10张车票,并且在执行过程中独立地处理各自的资源,即三个窗口各自销售10张车票,如图12.7所示。

(www.daowen.com)

图12.7 售票过程

2.采用实现Runnable接口的方式

在cn.pzhu.ticket包下创建一个名为MyRunnable的类,在这个类中覆写run()方法并实现售票操作,关键代码如下:

在cn.pzhu.ticket的包下创建一个名为Example04的类,在这个类中创建三个线程来模拟三个售票窗口进行售票,关键代码如下:

运行结果如图12.8所示。

图12.8 程序运行结果

从图12.8的运行结果可以看出,3个售票窗口将共同销售10张车票,即三个线程共享公共资源,如图12.9所示。

图12.9 售票过程

说明:

由于多个线程共享tickets这个变量,因此程序的输出结果可能和预期不一样(图12.7中多次输出了正在销售第2,4,10张票),这是因为多线程存在线程安全问题,要解决此问题可参考12.5小节多线程同步。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈