Java多线程同步机制在售票系统的实现_第1页
Java多线程同步机制在售票系统的实现_第2页
Java多线程同步机制在售票系统的实现_第3页
Java多线程同步机制在售票系统的实现_第4页
Java多线程同步机制在售票系统的实现_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java多线程同步机制在售票系统的实现论文导读:多线程技术的思想已经使用了很长的一段时间。但其不支持相同优先级的时间片轮换。多个用户线程在并发运行过程中可能同时访问临界区的内容。在Java中定义了线程同步的概念。关键词:多线程技术,多线程优先级,时间片,同步,临界区引言:多线程技术的思想已经使用了很长的一段时间,它允许CPU处理器时间共享,即很多用户可以共享处理器,每个用户的任务都分配到一段处理器时间。多线程是现代操作系统有别于传统操作系统的重要标志之一,它有别于传统的多进程的概念。所谓线程就是程序中的一个执行流,多线程程序是指一个程序中包含有多个执行流,多线程是实现并发机制的一种有效手段。进

2、程和线程一样,都是实现并发性的一个基本单位。1基本概念:1.1线程与进程的主要区别:同样作为基本的执行单元,线程的划分比进程小。多进程每个占有独立的内存空间,而多线程共享同一内存空间,通过共享的内存空间来交换信息,切换效率远远高于多进程。Java线程调度器支持不同优先级线程的抢占方式,但其不支持相同优先级的时间片轮换。Java运行时系统所在的操作系统(例如:Windows XP)支持时间片的轮换,则线程调度器就支持相同优先级线程的时间片轮换。免费论文参考网。1.2Java多线程的特点:1.2.1多线程的继承由于Java引入了包的概念,从而使类的继承更加简便,线程的创建就是一个最好的例子。Jav

3、a多线程的实现有两种办法通过Thread继承,在下面的研究中,我主要用继承自Thread类来实现Java的多线程技术。通过Runnable接口。1.2.2Java多线程的同步技术Java应用程序的多个线程共享同一进程的数据资源,多个用户线程在并发运行过程中可能同时访问临界区的内容,为了程序的正常运行,在Java中定义了线程同步的概念,实现对临界区共享资源的一致性的维护。1.3.3Java多线程的流程控制Java流程控制的方法有Sleep().Interrupt().Wait().Notif().Join()等。1.3.4临界区在一个多线程的程序当中,单独的并发的线程访问代码段中的同一对象,则这

4、个代码段叫做临界区,我们需要用同步的机制对代码段进行保护,避免程序出现不确定的因素。1.3.5同步机制Java中支持线程的同步机制,它由synchronized方法实现,分为同步块和同步方法,在下面的讨论中用synchronized的同步块来解决问题。2.多线程同步机制在车票系统的实现2.1下面就以售票系统中所涉及的问题来讨论Java的多线程同步机制问题,在售票系统中由于很大一部分时间可能有多人在购买车票,所以必须开辟多个线程同时为他们服务,在这里我设有四个售票窗口,则开辟四个线程来为四个窗口服务模拟图如下: 窗口1 窗口2窗口3 窗口4Thread1Thread2 Thread3Thread

5、4售票窗口模拟图2.2出错的程序代码如下:class TicketsSystempublic 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 Threadinttickets=60;public voidrun()while(true)if(tickets0)System.out.println(

6、Thread.currentThread().getName()+sellticket +tickets);tickets-;在上面的程序中为了简单起见,我把一班车的车票数定为60张。这个系统在交付使用后的一段时间后,车站管理人员说系统出错了,当票卖完了60张后,当还有人来买票后,它有时还会打印出票来,当然这种情况并不多见。我仔细研究后得知出错的主要原因是当第一个售票窗口(Thread1)进入if(tickets0)System.out.println(Thread.currentThread().getName()+ sellticket+tickets);Tickets-;代码段后,它的时

7、间片到期,然后第二个售票窗口(Thread2)进入if代码段,它的时间片已到期。然后第三个窗口(Threas3)进入if代码段。免费论文参考网。同理第四个窗口(Thread4)以一样。当然这种线程在进入代码段后时间片到期的现象并不多见,但作为车站长时间工作的售票系统来说,这种错误就可能发生,而且一旦发生将带来灾难性的后果。为了便于观察到这个错误,我调用了Thread类中的Sleep()方法,程序中的错误就直观的表现出来。免费论文参考网。2.3直观反映出错的程序如下:class TicketsSystempublic staticvoid main(String args)SellThread

8、kt=new SellThread();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();class SellThreadextends Threadinttickets=60;public voidrun()while(true)if(tickets0)tryThread.sleep(20);catch(Exception e)e.printStackTrace();System.out.println(Thread.currentThread().getNa

9、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代码段里面,从而导致了

10、系统继续把0,-1,-2的票打印出来,这当然不是我们想要的结果。下面我采用Java多线程同步机制中的同步块技术来完善这个代码段,问题得以解决。2.4修改后的程序代码如下:classTicketsSystempublic 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 ThreadObject ob

11、j=new Object();inttickets=60;public voidrun()while(true)synchronized(obj)if(tickets0)tryThread.sleep(20);catch(Exception e)e.printStackTrace();System.out.println(Thread.currentThread().getName()+sellticket +tickets);tickets-;它的实现原理是当有一个线程进入同步块之后,其它线程就没有机会进入同步块程序,只能等到进入同步块的线程退出以后才能进入同步块程序,这样就避免了系统在车票卖完了以后还能继续卖票的问题。结束语:本文讲述的关键问题是借助多线程的同步机制来解决长途汽车站售票系统中的售票系统的不稳定的问题.我们借助多线程的同步机制解决了上述问题,使系统得以高效地运行.参考文献:1.Java编程思想 Bruce Eckel 著 候捷 译 机械工业出版社 20052.Java

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论