欢迎来到论文网! 识人者智,自知者明,通过生日认识自己! 生日公历:
网站地图 | Tags标签 | RSS
论文网 论文网8200余万篇毕业论文、各种论文格式和论文范文以及9千多种期刊杂志的论文征稿及论文投稿信息,是论文写作、论文投稿和论文发表的论文参考网站,也是科研人员论文检测和发表论文的理想平台。lunwenf@yeah.net。
您当前的位置:首页 > 科技论文 > 计算机论文

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

时间:2011-04-23  作者:秩名

论文导读:多线程技术的思想已经使用了很长的一段时间。但其不支持相同优先级的时间片轮换。多个用户线程在并发运行过程中可能同时访问临界区的内容。在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 窗口4
Thread1Thread2 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.currentThread().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().getName()+
'sellticket '+tickets);
tickets--;
}
}
}
}

运行结果如下:
Thread-1 sellticket 60
Thread-1 sellticket 59
…………….
…………….
Thread-4 sellticket 1
Thread-3 sellticket 0
Thread-1 sellticket -1
Thread-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().getName()+
'sellticket '+tickets);
tickets--;
}
}
}
}
}

它的实现原理是当有一个线程进入同步块之后,其它线程就没有机会进入同步块程序,只能等到进入同步块的线程退出以后才能进入同步块程序,这样就避免了系统在车票卖完了以后还能继续卖票的问题。
结束语:本文讲述的关键问题是借助多线程的同步机制来解决长途汽车站售票系统中的售票系统的不稳定的问题.我们借助多线程的同步机制解决了上述问题,使系统得以高效地运行.
参考文献:
1.Java编程思想 Bruce Eckel 著 候捷 译 机械工业出版社 2005
2.Java面向对象程序设计 Paul S.Wang 著 杜一民 译 清华大学出版社 2003
3.Java网络高级编程金勇华 曲俊生等 著 人民邮电出版社 2002
4.Java程序设计与应用开发於东军 杨静宇等 著 清华大学出版社 2005
5.Java与模式阎宏 著 电子工业出版社 2002
6.Java2从入门到精通 JohnZukowski 著 电子工业出版社 2000
 

查看相关论文专题
加入收藏  打印本文
上一篇论文:IPV6技术研究
下一篇论文:Java反射技术浅谈
科技论文分类
科技小论文 数学建模论文
数学论文 节能减排论文
数学小论文 低碳生活论文
物理论文 建筑工程论文
网站设计论文 农业论文
图书情报 环境保护论文
计算机论文 化学论文
机电一体化论文 生物论文
网络安全论文 机械论文
水利论文 地质论文
交通论文
相关计算机论文
最新计算机论文
读者推荐的计算机论文