//模拟火车票售票系统
class TicketsThread{
public static void main(String args[])
{
SellThread mythread=new SellThread();
new Thread(mythread).start();
new Thread(mythread).start();
new Thread(mythread).start();
new Thread(mythread).start();
//这4个线程同时进行售票
}
}
class SellThread implements Runnable{
int tickets=100;//一共要卖100张票
public void run()
{
while(true){
if(tickets>0){
try{
Thread.sleep(10);//这10毫秒用来处理一些数据或其他售票过程
}
catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"sell ticket:"+tickets);
tickets--;
}
}
}
}
问题1:Runnable 和 Thread有什么关系和区别?
答:实现多线程程序的两种方式:
(1)从Thread类继承;
(2)实现Runnable接口。
Thread类实现了Runnable接口。
如果多个线程访问同一个资源(比如变量),那么必须使用方式(2)。
除非要使用Thread中除run方法以外的其他方法,才用方式(1)。一般,只需用方法(2)。
问题2:如果运行上面这个程序,输出是:
.......
//把前面正常的输出省略了
Thread-3sell tickets 1
Thread-0sell tickets 0
Thread-1sell tickets -1
Thread-2sell tickets -2
很明显,结果是错误的,怎么可能卖出0,-1,-2这三张票??
关键就在Thread.sleep(10);这里。在这里,四个进程的时间片发生了轮换。
我们可以使用同步机制解决这个问题。这里不做解释,看代码:
class TicketsSystem
{
public static void main(String[] args)
{
SellThread st=new SellThread();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
}
}
class SellThread implements Runnable
{
int tickets=100;
Object obj=new Object();
public void run()
{
while(true)
{
synchronized(obj)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
if(tickets>0)
{
System.out.println("obj:"+Thread.currentThread().getName()+" sell tickets:"+tickets);
tickets--;
}
//或者调用sell()
}
}
}
}
public synchronized void sell()
{
synchronized(obj)
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("sell():"+Thread.currentThread().getName()+
" sell tickets:"+tickets);
tickets--;
}
}
}
}
分享到:
相关推荐
孙鑫java视频教程课件.doc
孙鑫c++视频总结,入门学习,包括算法,数据结构,编译原理
Java开发详解视频教程(孙鑫)9a
NULL 博文链接:https://deankong.iteye.com/blog/1365884
NULL 博文链接:https://deankong.iteye.com/blog/1339083
孙鑫VC++视频讲座配套幻灯+全套示例源代码
孙鑫JAVA从入门到精通课件整理.ppt
经典资料:孙鑫vc++视频讲义配套的源代码20集全第1-10。
最近正在学习C++,费了很多心思,分亨一下我的学习资源,孙鑫C++教程(全20讲)PPT讲义源码及电子书资源包括三部分 1.孙鑫C++教程PPT 2.孙鑫C++教程源码 3.孙鑫C++教程电子书 VC++深入详解的全部课程目录 第一课:...
JAVA从入门到精通.孙鑫老师主讲
孙鑫VC视频教程笔记
内容为.doc格式,很难搜到的,孙鑫老师,这还用我说吗,用得着 <br>赶紧下吧...
Vc程序设计视频,孙鑫老师的VC视频,使你精通VC程序设计,让你能够自己亲手编写window窗口
《Java Web开发详解——XML+DTD+XML Schema+XSLT+Servlet3.0+JSP2.2深入剖析与实例应用》语言生动、通俗易懂、讲解细致,大部分章节都提供了多个例子,而且很多例子都是目前Web开发中经常使用的功能,具有相当高的...
孙鑫C++视频教程总结(内功=算法+数据结构+编译原理+操....doc
孙鑫老师VC++6.0视频教程对应源代码 第一课源代码
孙鑫视频源码,初学者的指路灯,里面含有二十个章节的所有代码,从C++的最初到最后的钩子原理,为我们更深刻的了解C++起了很好的作用
21天学通JavaScript - - 2013-03-22 Java开发全面通(教程,实例,资源 ... 孙鑫JAVA教程全集 - - 2013-03-23 张孝祥JAVA视频教程高级部分完整版续 全 - - 2013-04-21 编程之道—Java程序设计入门
孙鑫java web开发详解源代码呀,很不错。。。