当前位置:文档之家› Java多线程同步机制在售票系统的实现

Java多线程同步机制在售票系统的实现

Java多线程同步机制在售票系统的实现
论文导读:多线程技术的思想已经使用了很长的一段时间。

但其不支持相同优先级的时间片轮换。

多个用户线程在并发运行过程中可能同时访问临界区的内容。

在Java中定义了线程同步的概念。

关键词:多线程技术,多线程优先级,时间片,同步,临界区引言:多线程技术的思想已经使用了很长的一段时间,它允许CPU处理器时间共享,即很多用户可以共享处理器,每个用户的任务都分配到一段处理器时间。

多线程是现代操作系统有别于传统操作系统的重要标志之一,它有别于传统的多进程的概念。

所谓线程就是程序中的一个执行流,多线程程序是指一个程序中包含有多个执行流,多线程是实现并发机制的一种有效手段。

进程和线程一样,都是实现并发性的一个基本单位。

1.基本概念:1.1线程与进程的主要区别:①同样作为基本的执行单元,线程的划分比进程小。

②多进程每个占有独立的内存空间,而多线程共享同一内存空间,通过共享的内存空间来交换信息,切换效率远远高于多进程。

③Java线程调度器支持不同优先级线程的抢占方式,但其不支持相同优先级的时间片轮换。

④Java运行时系统所在的操作系统(例如:Windows XP)支持时间片的轮换,则线程调度器就支持相同优先级线程的时间片轮换。

免费论文参考网。

1.2Java 多线程的特点:1.2.1多线程的继承由于Java引入了包的概念,从而使类的继承更加简便,线程的创建就是一个最好的例子。

Java多线程的实现有两种办法①通过Thread继承,在下面的研究中,我主要用继承自Thread类来实现Java的多线程技术。

②通过Runnable接口。

1.2.2Java多线程的同步技术Java应用程序的多个线程共享同一进程的数据资源,多个用户线程在并发运行过程中可能同时访问临界区的内容,为了程序的正常运行,在Java中定义了线程同步的概念,实现对临界区共享资源的一致性的维护。

1.3.3Java多线程的流程控制Java流程控制的方法有Sleep().Interrupt().Wait().Notif().Join()等。

1.3.4临界区在一个多线程的程序当中,单独的并发的线程访问代码段中的同一对象,则这个代码段叫做临界区,我们需要用同步的机制对代码段进行保护,避免程序出现不确定的因素。

1.3.5同步机制Java中支持线程的同步机制,它由synchronized方法实现,分为同步块和同步方法,在下面的讨论中用synchronized的同步块来解决问题。

2.多线程同步机制在车票系统的实现2.1下面就以售票系统中所涉及的问题来讨论Java的多线程同步机制问题,在售票系统中由于很大一部分时间可能有多人在购买车票,所以必须开辟多个线程同时为他们服务,在这里我设有四个售票窗口,则开辟四个线程来为四个窗口服务模拟图如下:窗口 1 窗口2窗口 3 窗口4Thread1Thread2 Thread3Thread4售票窗口模拟图 2.2出错的程序代码如下:class TicketsSystem{public staticvoid main(String[] args){SellThread kt=new SellThread();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();}}class SellThreadextends Thread{inttickets=60;public
voidrun(){while(true){if(tickets>0){System.out.println(Thread.currentThr ead().getName()+'sellticket '+tickets);tickets--;}}}}在上面的程序中为了
简单起见,我把一班车的车票数定为60张。

这个系统在交付使用后的一段时间后,车站管理人员说系统出错了,当票卖完了60张后,当还有人来买票后,它有时还会打印出票来,当然这种情况并不多见。

我仔细研究后得知出错的主要原因是当第一个售票窗口(Thread1)进入if(tickets>0){System.out.println(Thread.currentThread().getName()+' sellticket'+tickets);Tickets--;}代码段后,它的时间片到期,然后第二个售票窗口(Thread2)进入if代码段,它的时间片已到期。

然后第三个窗口(Threas3)进入if代码段。

免费论文参考网。

同理第四个窗口(Thread4)以一样。

当然这种线程在进入代码段后时间片到期的现象并不多见,但作为车站长时间工作的售票系统来说,这种错误就可能发生,而且一旦发生将带来灾难性的后果。

为了便于观察到这个错误,我调用了Thread类中的Sleep()方法,程序中的错误就直观的表现出来。

免费论文参考网。

2.3直观反映出错的程序如下:class TicketsSystem{public staticvoid main(String[] args){SellThread kt=new SellThread();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();}}class SellThreadextends Thread{inttickets=60;public
voidrun(){while(true){if(tickets>0){try{Thread.sleep(20);}catch(Exception e){e.printStackTrace();}System.out.println(Thread.currentThread().getNa me()+'sellticket '+tickets);tickets--;}}}}运行结果如下:Thread-1 sellticket 60Thread-1 sellticket 59…………….…………….Thread-4 sellticket 1Thread-3
sellticket 0Thread-1 sellticket -1Thread-1 sellticket -2从上面的执行结果就可以看出为什么系统中票已卖完还可以继续卖几张的原因,就是因为当系统中只有一张票的时候,第一个线程都进入了if代码段里面,它睡眠20毫秒,第二个线程进入if代码段里面,它已睡眠20毫秒。

以此类推,第三,第四个线程if代码段里面,从而导致了系统继续把0,-1,-2的票打印出来,这当然不是我们想要的结果。

下面我采用Java多线程同步机制中的同步块技术来完善这个代码段,问题得以解决。

2.4修改后的程序代码如下:classTicketsSystem{public staticvoid main(String[] args){SellThread kt=new SellThread();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();}}class SellThreadextends Thread{Object obj=new Object();;inttickets=60;public
voidrun(){while(true){synchronized(obj){if(tickets>0){try{Thread.sleep(20 );}catch(Exception
e){e.printStackTrace();}System.out.println(Thread.currentThread().getNa me()+'sellticket '+tickets);tickets--;}}}}}它的实现原理是当有一个线程进入同步块之后,其它线程就没有机会进入同步块程序,只能等到进入同步块的线程退出以后才能进入同步块程序,这样就避免了系统在车票卖完了以后还能继续卖票的问题。

结束语:本文讲述的关键问题是借助多线程的同步机制来解决长途汽车站售票系统中的售票系统的不稳定的问题.我们借助多线程的同步机制解决了上述问题,使系统得以高效地运行.参考文献:1.Java编程思想Bruce Eckel 著候捷译机
械工业出版社20052.Java面向对象程序设计Paul S.Wang 著杜一民译清华大学出版社20033.Java网络高级编程金勇华曲俊生等著人民邮电出版社20024.Java程序设计与应用开发於东军杨静宇等著清华大学出版社20055.Java与模式阎宏著电子工业出版社20026.Java2从入门到精通JohnZukowski 著电子工业出版社2000。

相关主题