//模拟火车票售票系统
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
标题“孙鑫Java无难事07”暗示了这是一个关于Java编程的学习资源,可能是系列教程的一部分,专注于解决Java编程中的挑战。在这个特定的章节“Lesson5多线程”,我们将深入探讨Java中的多线程概念。 在Java中,多...
标题“孙鑫Java无难事08”暗示了这是一个关于Java编程的学习资源,可能是系列教程的一部分,专注于解决Java学习中的难题。在这个特定的章节中,我们可能会深入理解Java集合框架,这是Java编程中的一个核心部分。 ...
在孙鑫的C++视频教程中,我们深入学习了C++这一强大且广泛使用的编程语言。这个教程不仅涵盖了C++的基础语法,还涉及了更为高级的主题,如算法、数据结构和编译原理,旨在帮助初学者全面理解C++并具备实际编程能力。...
《孙鑫VC++视频讲义配套源代码》是一份经典的编程学习资源,涵盖了从基础到进阶的VC++编程知识。这份资料由知名IT讲师孙鑫精心制作,旨在帮助学习者通过实际操作来理解VC++编程的核心概念和技术。源代码分为20个部分...
本教程“Java的多线程”由孙鑫老师主讲,旨在帮助初学者从入门到精通地掌握这一关键技能。 首先,我们来了解一下程序、进程和线程的基础概念: 1. **程序**:程序是一组有序的指令,它们定义了计算机执行特定任务...
最近正在学习C++,费了很多心思,分亨一下我的学习资源,孙鑫C++教程(全20讲)PPT讲义源码及电子书资源包括三部分 1.孙鑫C++教程PPT 2.孙鑫C++教程源码 3.孙鑫C++教程电子书 VC++深入详解的全部课程目录 第一课:...
【Java开发详解视频教程(孙鑫)9a】是一套专为软件设计师打造的Java学习资源,由知名讲师孙鑫主讲。这个教程涵盖了Java编程的深入细节,旨在提升学员在Java开发领域的技能和理解力。通过这五个部分的课程,我们可以...
理解线程安全和并发编程,对于编写高效率的多线程程序至关重要。 Java集合框架是处理数据结构和对象容器的关键。List、Set、Map接口及其实现类如ArrayList、LinkedList、HashSet、HashMap等,都是开发者需要熟练...
在配套的源代码部分,我们可以找到每个视频讲解案例的实际实现,这些代码涵盖了从基本语法到高级特性的各种应用,包括输入输出操作、内存管理、函数调用、类的设计与使用、异常处理、多线程编程、图形界面开发等。...
Vc程序设计视频,孙鑫老师的VC视频,使你精通VC程序设计,让你能够自己亲手编写window窗口
随着时间的发展,Java经历了多个版本的迭代。JDK 1.2引入了"Java 2"的概念,后续的版本包括J2SE v1.4.2等。每个新版本都带来了性能提升、新特性和API的扩展。目前,Java已经更新到了Java 17,采用了更现代化的版本...
《Java Web开发详解——XML+DTD+XML Schema+XSLT+Servlet3.0+JSP2.2深入剖析与实例应用》语言生动、通俗易懂、讲解细致,大部分章节都提供了多个例子,而且很多例子都是目前Web开发中经常使用的功能,具有相当高的...
孙鑫C++视频教程总结(内功=算法+数据结构+编译原理+操....doc
《J2SE-孙鑫授课总结的PPT》是一份深度总结Java标准版(Java 2 Platform, Standard Edition,简称J2SE)核心知识的教学资料,由知名IT教育专家孙鑫精心编撰。这份PPT涵盖了Java SE的各个方面,旨在帮助学习者系统地...
Java 培训总结 Java 作为一种广泛应用的高级编程语言,具有跨平台的特性,能够应用于网络、桌面、分布式和嵌入式环境。其旺盛的生命力吸引了大量的学习者。Java 技术的学习通常分为几个阶段: 1. **Java 技术入门*...
《孙鑫 VC++ 深入详解》是一本深受程序员喜爱的VC++技术书籍,作者孙鑫以其深入浅出的讲解方式,详细剖析了VC++的底层机制和高级特性。书中的源码是理解理论知识的关键实践部分,通过分析和运行这些代码,读者可以更...
在实战项目中,学习者通常会接触到Java的高级特性,比如多线程编程、网络编程、文件操作等。通过实际操作,加深对Java技术应用的理解。 例如,“循序渐进学Java视频教程之坦克大战项目”就是一个结合了游戏开发的...
"Lesson1Code"包含了孙鑫老师VC++6.0视频教程的第一课源代码。这通常是介绍C++基础语法和IDE的使用。在这一课中,可能会涵盖以下知识点: 1. **基本环境设置**:如何安装和配置VC++6.0,包括创建新项目、设置编译...